我可以在控制器中设置默认命名空间路由吗
Posted
技术标签:
【中文标题】我可以在控制器中设置默认命名空间路由吗【英文标题】:Can I set a default namespace route in a controller 【发布时间】:2012-04-16 23:06:04 【问题描述】:我正在添加一个带有几个控制器的管理命名空间,所以我们的东西可以从后端编辑内容。
例如,我有一个Book
模型和一个允许客人浏览的books_controller
。现在我添加一个admin/books_controller
,为管理员提供一个编辑书籍的后台。
namespace :admin do
resources :books, except: :show
end
resources: books, only: [:index, :show]
目前对于 admin_books_controller 视图中的所有 link_to
和 form_for
,我需要像这样添加命名空间 :admin
:
<%= form_for([:admin, @post]) do |f| %>
(在普通控制器中为form_for(@post)
)
它有点重复,我想知道是否可以在管理控制器中的某个位置设置它,以便该控制器中的所有link_to
都将在管理命名空间中路由?
【问题讨论】:
如果您需要这样做,可能是您的代码有问题。 @lzap 更新了我的问题。你能详细说明一下吗? 【参考方案1】:如果您在命名空间下确定模型的范围,那应该会自动反映在表单生成器中。
所以像rails g model admin/book
这样的东西会生成一个嵌套在 admin 命名空间下的书籍模型。
如果您随后在该对象上构建一个表单,例如 form_for Admin::Book.new
这应该针对任何适当嵌套的路由,例如:
namespace :admin do
resources :books
end
我希望这可以说明您可以尝试的方向。
最好的问候。
【讨论】:
谢谢,但我想要的是管理普通资源,即已经有一个 Book 模型,我不确定创建另一个 Book 模型是否是个好主意。 我想您可以扩展表单构建器,然后在所有管理页面中使用该表单构建器,但这似乎比简单地将:admin
添加到形成 url 数组 :)
哦。刚想到一件事。另一种方法可能是创建一个辅助方法,比如form_url
,它接受一个参数(表单的对象)并返回数组[:admin, object]
。
很酷,谢谢,但我也希望link_to
也这样做。我想这毕竟是不可能的。
您始终可以扩展link_to
方法,但这确实不是最佳实践。问题是在 6 个月内,当您查看代码时,您将无法记住它为什么起作用。所以基本上:你永远不应该猴子补丁。以上是关于我可以在控制器中设置默认命名空间路由吗的主要内容,如果未能解决你的问题,请参考以下文章