11

私は2つのクラスを持っています:

class User < ActiveRecord::Base
  :has_one :foo
end

class Foo < ActiveRecord::Base
  :belongs_to :user 
end

Foo はオプションです。

次のルーティングを作成しました。

resources :users do
  resources :foo
end

その結果、次のルートになります。

GET    /users/:user_id/foo(.:format)              {:controller=>"foos", :action=>"index"}
user_foos POST   /users/:user_id/foo(.:format)              {:controller=>"foos", :action=>"create"}
new_user_foo GET    /users/:user_id/foo/new(.:format)          {:controller=>"foos", :action=>"new"}
GET    /users/:user_id/foo/:id(.:format)          {:controller=>"foos", :action=>"show"}
PUT    /users/:user_id/foo/:id(.:format)          {:controller=>"foos", :action=>"update"}
user_foo DELETE /users/:user_id/foo/:id(.:format)          {:controller=>"foos", :action=>"destroy"}
edit_user_foo GET    /users/:user_id/foo/:id/edit(.:format)     {:controller=>"foos", :action=>"edit"}

質問:

  1. Index および Show アクションは冗長なようです。それらの1つを削除する必要がありますか?もしそうなら、どれですか?
  2. user_id は foos テーブルの外部キーであり、ユーザーごとに 1 つの foo しかないため、Show アクションの :id パラメータは不要のようです。私は間違っていますか?
  3. foo がない場合に New アクションにルーティングする適切な方法が必要です。1 つのオプションは、@user.foo.nil をテストすることでしょうか? FooController の Show または Index アクションで、次に New アクションにリダイレクトします。より良い方法はありますか?

御時間ありがとうございます。

4

2 に答える 2

28

モデルに has_one 関連付けがある場合は、次を使用してルートを設定してみてくださいresource :foo(「resources」ではなく、単数形のメソッド名「resource」に注意してください)。これにより、シングルトン リソース ルートが設定されます (たとえば、メンバーが 1 つしかないため、インデックス アクションがなく、メンバー アクションには id パラメータがありません)。http://apidock.com/rails/ActionController/Resources/resource (2.3 のドキュメントですが、3.0 にも適用されます)も参照してください。

于 2010-08-02T14:59:21.223 に答える
3

クレイグが実際にそれを見逃した理由を理解できます。それはあまりにも微妙な違いで、私の頭にも浮かびませんでした。私にヒントを与えた唯一のことは、シングルトン リソースの名前付きルートに奇妙なインデックス名があることです:user_foo_indexではなくuser_foos.

これは、Rails 側に複数形が存在しないことを考えると、非常に賢明な推論です。

警告:次の例では、次のいずれかの方法で浅いネストを使用しています。

resources :cats, shallow: true do
  resources :noms
end

またはその:

resources :cats do
  shallow do
    resources :noms
  end
end

とにかくビジネスに戻ります。たとえば、単一のリソースをセットアップすると、次のように表示addressarticlesれます。

user_address_index GET | POST
  new_user_address GET
      edit_address GET
           address GET | PUT | DELETE

次に、Andreas が正しく指摘したように、ルートでこれを誤って宣言した可能性があります。

resources :users do
  resources :address
end

そして、それを次のように変更すると:

resources :users do
  resource :address
end

プロンプトを入力すると、次のように表示rake routesされます。

     user_address POST | GET | PUT | DELETE
 new_user_address GET
edit_user_address GET

注: rakes routes の出力がこのように正確に表示されないことはわかっています (かなり冗長です)。焦点を絞るために簡略化しています。

それが役立つことを願っています。

于 2011-08-30T16:13:16.067 に答える