2012-05-19 11 views
7

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

これはレール開発者には推奨されていないし、コントローラーやフォームビューでこれをどのようにネストするかを考えるのも非常に難しいので、これは間違ったやり方です。

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

正しい方法は、開発者がこれを行うべきであると言うレールそう

resources :account do 
    resources :people 
end 

resources :people do 
    resources :notes 
end 

のようなものですここで私はいつもに実行する問題があります。これまでアカウント/ 1 /人を訪問したときに、アカウントに人を追加することができ、そのURLはmysite.com/account/1/people/1のようなものであり、それはうまくいきます。今、私はエラーを取得するアカウント1からmysite.com/people/1/notesにアクセスしようとした場合

ない人とアカウントIDを見つけることができません

どのようにすることができますこれが正しく動作するようにしますか?

答えて

10

あなたの巣3.xのレールとして、好きな深いルートはあなたが浅い使用してそれらを平らにすることができます:真

は、あなたが得るものを見るために

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

使用すくいルートを使って実験してみてください。私が言ったように)応じて

UPDATEは何を参照してすくいルートで遊ぶ、

コメントするには、u RLさん、あなたは

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 

あなたにこれらのルートを取得し得ることができます。残りの部分は、コントローラのアクションに何を入れても構いません。

idparamsが渡されていないときに適切な処置を講じるためには、実際に操作を行う必要があります。そのため、idを特定のモデルに使用する場合は、idがparamsリストにあることを確認してください。そうでない場合、代替行動を取る。例えばアカウントIDを渡さないと、あなたがそれを使用しようとしていないことを確認してください

あなたのコメントはあなたが既に浅いルートを使用していると述べています。

+0

現在、私のルートファイルには浅いtrueがありますが、アカウントIDなしで人/ノートにどのようにアクセスできるかわかりません。 Railsがこのエラーを投げています。「IDなしでアカウントを見つけることができませんでした。」 – Yooku

+0

私は答えを更新しました。ものを明確にすることを望む – jamesc

関連する問題