我对Rails路由器和表单生成器有点问题。 我的应用程序具有模型和控制器的命名空间模块。模块用于更容易地抽象到另一个项目。
我在routes.rb
范围方法中使用了命名空间,因为我不会有"丑陋"道路助手。
看起来像:
scope module: :taxonomy do
resources :taxonomies do
resources :terms
end
end
问题是,当我想编辑分类法(网址:taxonomies/1/edit
)时,我收到错误:
undefined method `taxonomy_taxonomy_path'
因为我的路线只是taxonomy_path
有什么方法可以达到form_for @taxonomy
来识别该路线的范围?没有使用form_for @taxonomy, url: taxonomy_path(@taxonomy)
没有治愈。因为respond_with @taxonomy
中控制器方法中的@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
答案 0 :(得分:3)
您可以通过以下方式覆盖ActiveRecord的模型命名:
module Taxonomy
class Taxonomy < ActiveRecord::Base
def self.model_name
ActiveModel::Name.new("Taxonomy")
end
end
end
这将覆盖ActiveRecord默认命名生成,该生成为Taxonomy类生成taxonomy_taxonomy名称,因为它位于Taxonomy模块下。 它应解决您的路由名称问题,并根据需要生成正确的路由名称。
答案 1 :(得分:2)
在routes.rb中尝试:
namespace :taxonomy do
resources :taxonomies do
resources :terms
end
end
这可能要求您将控制器存储在名为taxonomy
的子目录中。
答案 2 :(得分:1)
由于文件夹结构,我很确定您需要向模块中添加模块。
app/models
├── ...
├── taxonomy
│ ├── taxonomy.rb
│ └── ...
└── ...
您可以配置导轨以递归地加载位于子文件夹中的模型:
配置您的config/application.rb
:
config.autoload_paths += Dir[ Rails.root.join('app', 'models', "taxonomy", '**/') ]
您可以在Rails应用中为任何文件夹和子文件夹设置此配置。
如果这样做,您将不必覆盖ActiveRecord的模型,这并不总是最好的主意。
class Taxonomy < ActiveRecord::Base
...
end