2013-02-18 10 views
17

私は次のモデルがあります:Railsネストされたリソースとルーティング - コントローラを分割する方法は?

  • ポスト
  • はタグ
  • TaggedPost(ポスト及びタグがhas_manyのことで自分の団体の派生元:を通じて)

そして私は、次のroutes.rbファイルを持っています:

resources :tags 

resources :posts do 
    resources :tags 
end 

したがって、I n /posts/4/tagsにアクセスすると、パラメータアレイにpost_id値が設定されたタグコントローラのインデックスアクションが表示されます。クール。

私の質問は、投稿の下に入れ子になっているタグリソースにアクセスしているので、まだタグコントローラを打つべきですか?または、この時点でタグのネストされた性質を処理するために他のコントローラをセットアップする必要がありますか?それ以外の場合は、タグコントローラに追加のロジックを構築する必要があります。これはもちろん可能ですが、ネストされたルートとリソースを処理する一般的な方法ですか?次のように私はタグコントローラのindexアクションを持っているコードは次のとおりです。私は多くの追加の計画として、私は、このコントローラーのコードは、ますます大きな成長して見ることができます

def index 
    if params[:post_id] && @post = Post.find_by_id(params[:post_id]) 
    @tags = Post.find_by_id(params[:post_id]).tags 
    else 
    @tags = Tag.order(:name) 
    end 
    respond_to do |format| 
    format.html 
    format.json {render json: @tags.tokens(params[:q]) } 
    end 
end 

TagsController.rbタグリソースに関連するリソース。これを打破する方法についての考え方?質問の

概要:

  1. リソースがネストされている場合は、ネストされたリソースは、リソースの入れ子の本質を表現する別のコントローラを経由すべきですか?これは、私が提供したコード例にあるように、通常のコントローラを通すこととは対照的です。
  2. もしそうなら、これらのコントローラーはどのように命名されセットアップされるべきですか?

詳細情報が必要な場合はお知らせください。

答えて

4

ネストされたリソースを使用していると、ルーティングURLが変更されます。あなたがしなければならないことは、(あなたのケースポストで)適切なIDをタグコントローラに渡していることを確認することだけです。最も一般的なエラーは、Can not Find *** IDです。

あなたはそれがこの

domain.com/user/1

domain.com/profile/2

あなたのようになり、ユーザのルートに巣プロファイルルートをいない場合巣ルートはそれがやっているすべてのことである

domain.com/user/1/profile/2

だろう。他には何もない。コントローラを追加する必要はありません。ネストされたルーティングを行うことは、見た目だけです。あなたのユーザーはその関連付けに従うことができます。ルートのネストに関する最も重要なことは、正しいパスにlink_toを確実にすることです。それがネストされているときにuser_profile_pathを使用する必要がありますUSER_PATHとPROFILE_PATH

次のようになります。ネストされていない

rake routeは、ルートがどのように変更されたかを調べるためのあなたの友人です。

願っています。

+0

これは実際に私の質問の核心に答えるものです。それ以外の物流は本当に私の強迫的な構成の必要性に依存していると思います。 –

+0

あなたの将来の同僚のために(あなた自身も未来)、@ lazelの答えも読んでください! – gfd

+0

これをダウン投票することでいくつかの難しいポイントを費やすつもりです。ネストされたコントローラを追加してください。 – Drenmi

29

私は最善の解決策は、コントローラを分割することであると思う:

resources :tags 

    resources :posts do 
     resources :tags, controller: 'PostTagsController' 
    end 

そして、あなたは3つのコントローラーを持っています。違いは、あなたができる、タグの検索のみである場合

class PostTagsController < TagsController 
     def index 
      @tags = Post.find(params[:post_id]).tags 
      super 
     end 
    end 

class TagsController < ApplicationController 
     def tags 
      Tag.all 
     end 

     def tag 
      tags.find params[:id] 
     end 

     def index 
      @tags = tags 
      # ... 
     end 
     # ... 
    end 

    class PostTagsController < TagsController 
     def tags 
      Product.find(params[:product_id]).tags 
     end 
    end 

にタグを上書きする方法と、単純に使用を必要に応じて、あなたのような何かをするTagsControllerから PostTagsControllerを継承することができます)

+1

この回答は、次の同僚のIMHOにとってははるかに明確で理解しやすいものです。私はRailsがDRYのすべてであることを知っていますが、この場合、OPは「タグリソースに関連する多くの追加リソースを計画しています」と言っているので、それぞれの関連付けを区別することはおそらく大きな助けになるでしょう... – gfd

+1

コントローラオプション代わりに 'post_tags'を使うべきです。 http://guides.rubyonrails.org/routing.html#specifying-a-controller-to-use –

関連する問題