Rails namecoped模型对象没有模块前缀路由路径

时间:2012-08-07 09:41:30

标签: ruby-on-rails namespaces routes nested-routes

我对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

3 个答案:

答案 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