8

多くの Rails 開発者が、リソースを 2 レベル以上ネストするのは間違っていると言っているのは知っています。URL が mysite.com/account/1/people/1/notes/1 のようになると面倒になるので、私も同意します。ネストされたリソースを使用する方法を見つけようとしていますが、3 レベルの深さでネストする必要はありません。

Rails開発者は推奨していないため、これは間違った方法であり、コントローラーまたはフォームビューでこれをネストする方法を理解することも非常に困難です。

resources :account do 
  resources :people do
    resources :notes
  end
end

Rails開発者がこれを行うべきだと言っている正しい方法は次のとおりです

resources :account do 
  resources :people
end

resources :people do
  resources :notes
end

ここで私がいつも遭遇する問題があります。account/1/people にアクセスするたびに、アカウントに人を追加して、URL が mysite.com/account/1/people/1 のようになっているとしましょう。

アカウント 1 から mysite.com/people/1/notes にアクセスしようとすると、エラーが発生します。

アカウント ID のない人は見つかりません

どうすればこれを適切に機能させることができますか?

4

1 に答える 1

11

rails 3.x では、shallow: true を使用してルートを平坦化できるので、好きなだけルートをネストします。

で実験してみてください

resources :account, shallow: true do 
  resources :people do
    resources :notes
  end
end

レーキ ルートを使用して、何が得られるかを確認してください :)

コメントに応じて更新

先ほど言ったように、rake ルートで遊んで、取得できる URL を確認してください。

resources :account, shallow: true do 
  resources :people, shallow: true do
    resources :notes
  end
end

これらのルートを取得します

:~/Development/rails/routing_test$ rake routes
      person_notes GET    /people/:person_id/notes(.:format)        notes#index
                   POST   /people/:person_id/notes(.:format)        notes#create
   new_person_note GET    /people/:person_id/notes/new(.:format)    notes#new
         edit_note GET    /notes/:id/edit(.:format)                 notes#edit
              note GET    /notes/:id(.:format)                      notes#show
                   PUT    /notes/:id(.:format)                      notes#update
                   DELETE /notes/:id(.:format)                      notes#destroy
    account_people GET    /account/:account_id/people(.:format)     people#index
                   POST   /account/:account_id/people(.:format)     people#create
new_account_person GET    /account/:account_id/people/new(.:format) people#new
       edit_person GET    /people/:id/edit(.:format)                people#edit
            person GET    /people/:id(.:format)                     people#show
                   PUT    /people/:id(.:format)                     people#update
                   DELETE /people/:id(.:format)                     people#destroy
     account_index GET    /account(.:format)                        account#index
                   POST   /account(.:format)                        account#create
       new_account GET    /account/new(.:format)                    account#new
      edit_account GET    /account/:id/edit(.:format)               account#edit
           account GET    /account/:id(.:format)                    account#show
                   PUT    /account/:id(.:format)                    account#update
                   DELETE /account/:id(.:format)                    account#destroy

ご覧のとおり、必要と判断したレベルに関係なく、すべてのモデルにアクセスできます。残りは、コントローラーのアクションに何を入れるかにかかっています。

id パラメーターが渡されない場合に適切なアクションを実行するように、アクションに実際に取り組む必要があります。そのため、特定のモデルの id を使用する場合は、id がパラメーター リストにあることを確認し、そうでない場合は別の方法を取ります。アクション。たとえば、アカウント ID を渡さない場合は、使用しないようにしてください。

あなたのコメントは、すでに浅いルートを使用していると述べていますが、それはあなたが質問に投稿したものではありませんか?

于 2012-05-19T01:55:27.663 に答える