18

私のアプリに Foo と Bar の 2 つのモデルがあるとします。

Foo オプションで、Bars_to Bar に属します。

今、私は 1 つの Foo を見ることも、特定の Foo を検索することもでき、FoosController がそれらすべてを処理します。私の URL は次のようなものです: foos/1foos/new

ときどきバーを見たくなります。BarsController がそれを処理し、次のように取得します: bars/1またはbars/1/edit.

Bar を見ている場合、その Bar の一部であるすべての Foo をブラウズしたいと思うかもしれません。bars/1/foos/それで、それらのFoosを見るために使用したいと思います。

これは、ネストされたリソースでは非常に簡単で、次のようになります。

resources :foo
resources :bar do
  resources :foo
end

ただし、Bar の一部である Foo は、通常の Foo とは一線を画す特別なものです。したがって、たとえば、foos/1またはをロードbars/1/foos/1すると、同じ Foo が表示されますが、それぞれのケースで異なる情報に注目しています。

そのため、バーのコンテキストにあるときに Foos を処理する BarFoos Controller を持つことを考えていました。ただし、BarFoos を Bar の下にネストすると、ヘルパーは and のようにbar_bar_foos_pathなりnew_bar_bar_foo_pathます。それは冗長に思えます。

それで、今は名前空間について考えていますが、これはこれまで調べたことのないものです。私が定義できるレールガイドに表示されます:

namespace "bar" do
  resources :foos
end

そうすれば、 のFoosControllerapp/bar/で 2 秒を作ることができ、その FoosController は のbar_foo_path(:id)代わりに のような素敵なヘルパーを使用して、Bar 内で Foos を処理できbar_bar_foo_path(:id)ます。

しかし、それを行うと、私のBarsController? I haveBarsControllerの代わりに if にリクエストをルーティングするにはどうすればよいですか?resources :barsnamespace "bar"

最後に、最上位の FoosController と名前が競合しないようにするために、セカンダリ FoosController 内で何か特別なことをする必要がありますか? ルーティングに「名前空間」と表示されていることは理解していますが、ルビー コードの残りの部分は、app/bar/foos_controllerapp/foos_controllerが同じクラスではないことをどのように認識しているのでしょうか。

ありがとう!

4

2 に答える 2

42

あなたが達成しようとしていることは次のとおりだと思います:

  1. バーにはFoosがたくさんあります
  2. Bar に属する Foos を表示
  3. 親に関係なく、すべての Foo を表示します。

あなたはそれを達成することができます:routes.rb:

resources :foos
resources :bars do
  resources :foos, :controller => 'bars/foos'
end

最終的に得られるルートヘルパーは次のとおりです。

  • バーパス
  • foos_path
  • bar_foos_path
  • などなど、残りの「レーキルート」=)

本質的には、次のようになります。

  • app/BarsController (レール g コントローラー バー)
  • app/FoosController (rails g コントローラー foo)
  • app/bars/FoosController (レール g コントローラー バー/foos)

FoosController では、通常どおり次のように foos にアクセスします。

@foos = Foos.all

また、bars/FoosController では、bar の foo に次のようにアクセスします。

@foos = @bar.foos

bar は、次のように、bars/foos コントローラーで事前に取得できます。

before_filter :get_client

private
def get_client
  @bar = Bar.find(params[:bar_id])
end

お役に立てれば。=)

編集:名前空間付きルートに関しては、リソースの一部をサブパスから取得したときに個人的に使用しました。たとえば、自分のサイトに管理セクションがある場合、次のようになります。

ルート.rb:

namespace :admin do
  resources :foos
end

そして、次のようにコントローラーを作成します。

rails g controller admin/foos

これにより、foos リソースがセットアップされ、"my site url"/admin/foos でアクセスできるようになり、admin_foos_path などのヘルパーも取得できます。

于 2011-03-02T00:08:37.053 に答える
5

このアプローチには短所があります。

たとえば、定数を宣言する場合。ネストされた resource の CONST_NAME ではfoos、スコープ アルゴリズムが原因で、Rails は「初期化されていない定数 ::Foo::CONST_NAME」例外をスローします。

このような動作を回避するには、次を使用します。

resources :foos
resources :bars do
  scope :module => "bar" do
    resources :foos #, :controller => 'bar/foos' no need to use this now because route will be searched there by default
  end
end

これで、次の使用中に例外が発生しなくなりました。

Foo::CONST_NAME

また

Bar::Foo::CONST_NAME
于 2012-07-11T13:00:45.027 に答える