2

我对 Rails 路由器和表单生成器有一点问题。我的应用程序具有模型和控制器的命名空间模块。模块用于更容易抽象到另一个项目。

我使用routes.rb范围内的方法而不是命名空间,因为我没有“丑陋”的路径助手。

看起来像:

scope module: :taxonomy do
  resources :taxonomies do
    resources :terms
  end
end

问题是当我想编辑分类(url:)时taxonomies/1/edit出现错误:

undefined method `taxonomy_taxonomy_path'

因为我的路线只是taxonomy_path

有什么方法form_for @taxonomy可以识别该路线的范围?不使用form_for @taxonomy, url: taxonomy_path(@taxonomy)是不能治愈的。因为控制器方法中的@taxonomy 对象respond_with @taxonomy总是引用到taxonomy_taxonomy_url

我的模型:

module Taxonomy
  class Taxonomy < ActiveRecord::Base
    has_many :taxonomy_terms, inverse_of: :taxonomy
    has_many :terms, through: :taxonomy_terms
  class Term < ActiveRecord::Base
    has_one :taxonomy_term, inverse_of: :term
    has_one :taxonomy, through: :taxonomy_term

和控制器:

module Taxonomy
  class TaxonomiesController < ApplicationController
4

3 回答 3

4

您可以通过以下方式覆盖 ActiveRecord 的模型命名:

module Taxonomy
  class Taxonomy < ActiveRecord::Base
    def self.model_name
      ActiveModel::Name.new("Taxonomy")
    end
  end
end

这会覆盖 ActiveRecord 默认命名生成,该生成为 Taxonomy 类生成 taxonomy_taxonomy 名称,因为它位于 Taxonomy 模块下。它应该可以解决您的路由名称问题并根据需要生成正确的路由名称。

于 2012-08-07T10:26:38.783 回答
3

在 routes.rb 中试试这个:

namespace :taxonomy do
  resources :taxonomies do
    resources :terms
  end
end

这可能需要您将控制器存储在一个名为的子目录taxonomy中。

于 2012-08-07T10:25:47.963 回答
2

由于您的文件夹结构,我很确定您需要向您的班级添加一个模块。

  app/models
  ├── ...
  ├── taxonomy
  │   ├── taxonomy.rb
  │   └── ...
  └── ...

您可以配置 rails 以递归方式加载位于子文件夹中的模型:

配置你的config/application.rb

config.autoload_paths += Dir[ Rails.root.join('app', 'models', "taxonomy", '**/') ]

您可以为 Rails 应用程序中的任何文件夹和子文件夹设置此配置。


如果这样做,您将不必覆盖 ActiveRecord 的模型,这并不总是最好的主意。

class Taxonomy < ActiveRecord::Base
  ...
end
于 2018-08-08T10:25:45.550 回答