ruby-on-rails - Rails 命名空间与嵌套资源

标签 ruby-on-rails ruby-on-rails-3 namespaces routes nested-resources

假设我的应用程序有两个模型,Foo 和 Bar。

Foo 可选belongs_to Bar。

现在我可以查看单个 Foo,或者搜索特定的 Foo,而 FoosController 会处理所有这些。我的网址是这样的:foos/1foos/new
有时我想看看一个酒吧。 BarsController 处理这个,我得到它像:bars/1bars/1/edit .

如果我正在查看 Bar,我可能想浏览属于该 Bar 的所有 Foos。所以,我想使用 bars/1/foos/看看那些 Foos。

这对于嵌套资源非常简单,它看起来像这样:

resources :foo
resources :bar do
  resources :foo
end

但是,作为 Bar 一部分的 Foos 有点特殊,与常规 Foos 不同。因此,例如,如果我加载 foos/1bars/1/foos/1 ,我会看同一个 Foo,但我在每种情况下都关注不同的信息。

所以我一直在考虑让 BarFoos Controller 在 Bar 上下文中处理 Foos。但是,如果我将 BarFoos 嵌套在 Bar 下,那么我的助手将类似于 bar_bar_foos_pathnew_bar_bar_foo_path .这似乎是多余的。

所以,现在我正在考虑命名空间,这是我以前从未研究过的。我在 Rails 指南中看到我可以定义:
namespace "bar" do
  resources :foos
end

如果我这样做,我可以再做一次 FoosControllerapp/bar/ , 并且 FoosController 可以通过像 bar_foo_path(:id) 这样的好 helper 处理 Bar 内的 Foos而不是 bar_bar_foo_path(:id) .

但如果我这样做,我的 BarsController 会发生什么? ?请求如何路由到 BarsController如果不是 resources :bars我有 namespace "bar" ?

最后,我需要在我的辅助 FoosController 中做什么特别的事情来确保与顶级 FoosController 没有名称冲突吗?我意识到路由说“命名空间”,但是其余的 ruby​​ 代码如何知道 app/bar/foos_controllerapp/foos_controller不是同一个类吗?

谢谢!

最佳答案

我认为你想要实现的是:

  • 酒吧有很多 Foos
  • 查看属于 Bar 的 Foos
  • 无论父级如何,查看所有 Foos。

  • 您可以通过以下方式实现:
    路线.rb:
    resources :foos
    resources :bars do
      resources :foos, :controller => 'bars/foos'
    end
    

    您最终得到的路线助手是:
  • bar_path
  • foos_path
  • bar_foos_path
  • 等等,等等,其余的“rake 路线”
    =)

  • 从本质上讲,您最终会得到:
  • app/BarsController (rails g Controller 栏)
  • app/FoosController (rails g Controller foos)
  • app/bars/FoosController (rails g Controller bar/foos)

  • 在 FoosController 中,您可以像往常一样访问 foos:
    @foos = Foos.all
    

    在 bar/FoosController 中,您可以使用以下命令访问 bar 的 foos:
    @foos = @bar.foos
    

    其中 bar 可以在 bar/foos Controller 中预先检索:
    before_filter :get_client
    
    private
    def get_client
      @bar = Bar.find(params[:bar_id])
    end
    

    希望这可以帮助。 =)

    编辑 :
    至于命名空间路由,当我从子路径检索一些资源时,我个人使用了它们。例如,如果我的网站有一个管理部分,那么我可能有以下内容:

    路线.rb:
    namespace :admin do
      resources :foos
    end
    

    我创建了我的 Controller :
    rails g controller admin/foos
    

    这将设置我的 foos 资源,以便我可以在“我的站点 url”/admin/foos 中访问它,并且还可以获取诸如 admin_foos_path 之类的帮助程序。

    关于ruby-on-rails - Rails 命名空间与嵌套资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5160021/

    相关文章:

    java - Java 中带有命名空间的 XPath

    xml - 如何用xmlns处理节点?

    ruby-on-rails - 获取 Rspec 错误没有使用 Mongoid 将 Symbol 隐式转换为 Integer

    ruby-on-rails - 如何使用 Rails、Carrierwave 和 Minimagick 在上传时裁剪图像?

    ruby-on-rails - 如何限制用户在未登录的情况下通过电子邮件链接进行操作?

    ruby-on-rails-3 - 没有任何数据库的 Rails 应用程序

    ruby-on-rails - 在 Rails 中为命名空间路由添加别名

    ruby-on-rails - 如何在 Rails 6 中一次运行所有测试,包括系统测试?

    ruby-on-rails - Rails Postgres 查询排除包含连接上三个记录之一的任何结果

    ios - 移动设备通过 Rails 后端相互发送消息