我可以在控制器中设置默认命名空间路由吗

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_toform_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 个月内,当您查看代码时,您将无法记住它为什么起作用。所以基本上:你永远不应该猴子补丁

以上是关于我可以在控制器中设置默认命名空间路由吗的主要内容,如果未能解决你的问题,请参考以下文章

如何在 xml 属性中设置命名空间?

c# XmlSerializer 反序列化器缺少默认命名空间

命名空间内的 JetBrains Rider 导入引用

使用命名空间路由时的路由错误

嵌套命名空间路由到错误的控制器

Laravel 5.7 使用某些命名空间的资源控制器路由名称是啥?