gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:33:00 26 4
gpt4 key购买 nike

假设我的应用程序有两个模型,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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com