【问题标题】:Rails namescoped model object without module prefix route path没有模块前缀路由路径的 Rails 命名范围模型对象
【发布时间】:2012-08-04 07:18:12
【问题描述】:

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) 是无法治愈的。因为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

【问题讨论】:

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


    【解决方案1】:

    我很确定你需要为你的类添加一个模块,因为你的文件夹结构。

      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
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我对此有一个疑问。当我不想访问没有命名空间前缀“Taxonomy::”的模型时,将模型名称更改为命名空间之外的解决方案是完美的。但是,当它应该是关键的时候,是否存在任何问题,比如模块模型的隔离性差、非标准的 Rails 行为或其他什么?
      • 我没有完全理解您的问题 - 您的意思是您现在在代码中通过 Taxonomy 而不是 Taxonomy::Taxonomy 访问类分类?
      • 我的错,当然不是,它调用的是模块,而不是模型。我的问题是,当我只希望路由路径/url 没有前缀时,更改模型名称不会产生反效果。比如升级 Rails 等未来的问题......
      • 修复了第一条评论。必须定义为ActiveModel::Name.new("Taxonomy::Taxonomy", nil, "Taxonomy")
      • 你用的是什么版本的rails?
      【解决方案3】:

      在 routes.rb 中试试这个:

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

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

      【讨论】:

      • 这可行,但路径带有 taxonomy_ 前缀。我使用“范围模块”来获得更漂亮的路径。
      猜你喜欢
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多