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 和命名空间的主要内容,如果未能解决你的问题,请参考以下文章

Tcl学习之--命名空间

Tcl学习之--命名空间

当顶层命名空间包含基类而内部命名空间包含子类时的 C# 命名空间和类/子类命名约定

应用命名空间和实例命名空间

python命名空间和作用域

tp5 加载 extend 类库的方法 (有命名空间和没有命名空间的调用)