25

私は次のモデルを持っています:

  • 役職
  • 鬼ごっこ
  • TaggedPost (そこから Post と Tag が has_many :through によって関連付けを取得します)

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

resources :tags

resources :posts do
  resources :tags
end

したがって、たとえば に移動すると、パラメーター配列に値が設定され/posts/4/tagsたタグ コントローラーのインデックス アクションが表示されます。post_id涼しい。

私の質問は、投稿の下にネストされたタグ リソースにアクセスしているので、まだタグ コントローラーにアクセスする必要があるのでしょうか? または、この時点でタグのネストされた性質を処理するために、他のコントローラーをセットアップする必要がありますか? それ以外の場合は、タグ コントローラーに追加のロジックを組み込む必要があります。これはもちろん実行できますが、これはネストされたルートとリソースを処理する一般的な方法ですか? タグ コントローラーのインデックス アクションのコードは次のとおりです。

タグController.rb

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

タグ リソースに関連付ける多くの追加リソースを計画しているため、このコントローラーのコードがますます大きくなっていることがわかります。これを打破する方法についての考えは?

質問の要約:

  1. リソースがネストされている場合、ネストされたリソースは、リソースのネストされた性質を表す別のコントローラーを通過する必要がありますか? これは、私が提供したコード例にあるように、通常のコントローラーを通過するのとは対照的です。
  2. もしそうなら、これらのコントローラはどのように名付けて設定するべきですか?

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

4

2 に答える 2

50

最善の解決策は、コントローラーを分割することだと思います。

    resources :tags

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

そして、3つのコントローラーがあります。オプションで、TagsControllerからPostTagsControllerを継承して、次のようなことを行うことができます。

    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

そのメソッドを使用して、継承するコントローラーのタグをオーバーライドするだけです;)

于 2013-02-18T23:30:43.563 に答える
6

ネストされたリソースで行っていることは、ルーティング URL を変更することだけです。あなたがしなければならない唯一のことは、適切なID(あなたの場合は投稿)をタグコントローラーに渡していることを確認することです. 最も一般的なエラーは、*** ID が見つかりません。

プロファイル ルートをユーザー ルートにネストしない場合、次のようになります。

domain.com/user/1

domain.com/profile/2

ルートをネストすると、

domain.com/user/1/profile/2

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

ネストされていない場合:

 user_path

 profile_path

ネストされている場合は、使用する必要があります

user_profile_path

rake routesルートがどのように変更されたかを調べるための友達です。

それが役に立てば幸い。

于 2013-02-18T23:00:33.970 に答える