respond_with 和命名空间
Posted
技术标签:
【中文标题】respond_with 和命名空间【英文标题】:respond_with and namespaces 【发布时间】:2012-02-13 17:46:19 【问题描述】:棘手的问题...
假设以下模型:
class Foo::Bar < ActiveRecord::Base
class Foo::Nut < ActiveRecord::Base
以下路线:
namespace :admin do
resources :bars do
resources :nuts do
在 /admin/bars/100/nuts 的坚果创建操作中,我根据发布数据创建模型并希望回复:
@respond_with(:admin, @bar, @nut) (where bar and nut had been set up in the action)
我遇到了这个可爱的错误:
NoMethodError (undefined method `admin_foo_bar_foo_nut_url')
我希望 rails 查找 admin_bar_nut_url 而不是 admin_foo_bar_foo_nut_url。
如果我能解决这个问题,有什么想法吗?很明显,我的模型在模块中定义...
宁愿不得不放弃模型命名空间,但如果必须的话也可以。
非常感谢!
【问题讨论】:
我遇到了同样的问题,除了我的“Foo”在你的情况下是“Admin”。 【参考方案1】:我不明白为什么您需要使用名称空间而不是使用 respond_to 而不是 respond_with
respond_to do |format|
format.html redirect_to(admin_bar_nut_url(@bar, @nut))
end
【讨论】:
【参考方案2】:要从您的路线中删除 foo,请在您的模型中覆盖 model_name
,例如:
class Foo::Bar < ApplicationRecord
def self.model_name
ActiveModel::Name.new(self, Foo)
end
end
class Foo::Nut < ApplicationRecord
def self.model_name
ActiveModel::Name.new(self, Foo)
end
end
这将导致Foo::Nut.model_name.route_key
成为“nuts”而不是“foo_nuts”
现在respond_with
应该可以正常工作了。
【讨论】:
以上是关于respond_with 和命名空间的主要内容,如果未能解决你的问题,请参考以下文章