3

次のように指定された 3 つの (関連する) モデルがあります。

class User < ActiveRecord::Base
  has_many :posts
  has_many :comments
  has_many :comments_received, :through => :posts, :source => :comments
end

class Post < ActiveRecord::Base
  belongs_to :user
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :user
  belongs_to :post
end

comments_receivedすべてのfor をルートで参照できるようにしたいと思いますuser。たとえば、すべての投稿のコメントを一括承認するためだとしましょう。(によって作成されることもありますが、ユーザーは自分の投稿にコメントできないことに注意してくださいcommentsusercommentspost。論理的には、これは次のように動作するはずです:

map.resources :users, :has_many => [:posts, :comments, :comments_received]

これは私にルートを与えるはずです

user_posts_path
user_comments_path
user_comments_received_path

最初の 2 つは機能しますが、最後の 1 つは機能しません。私は無駄になし_でそれを試しました。comments_received私は次のようなURLを取得しようとしています

http://some_domain.com/users/123/comments_received

私もそれを入れ子にしようとしましたが、多分私はそれを間違っています。その場合、マップは次のようになると思います。

map.resources :users do |user|
  user.resources :comments
  user.resources :posts, :has_many => :comments
end

URLは次のようになります。

http://some_domain.com/users/123/posts/comments

多分これは正しい方法ですが、構文が間違っていますか?

私はこれについて間違った方法で考えていますか?commentsユーザーのすべての投稿に追加されたすべて のページを取得できるはずだというのは、私には理にかなっているように思えます。

ご協力いただきありがとうございます!

4

3 に答える 3

2

リソースとモデルの関係を deinfe するための構文は似ていますが、リソースがモデルにマップされると誤解しないでください。David Black の発言を読んでください。

あなたが抱えている問題は、生成しているルートにあります。次のようにネストされた構文を使用します。

map.resources :users do |user|
  user.resources :posts
  user.resources :comments
  user.resources :comments_received
end

そして、 を実行する'rake routes'と、(他の多くのものの中で!) 私に与えられます:

                       users GET /users                              {:action=>"index", :controller=>"users"}
                  user_posts GET /users/:user_id/posts               {:action=>"index", :controller=>"posts"}
               user_comments GET /users/:user_id/comments            {:action=>"index", :controller=>"comments"}
user_comments_received_index GET /users/:user_id/comments_received   {:action=>"index", :controller=>"comments_received"}

したがって、rails は comments_received ルートの最後に _index を追加しているようです。理由がわからないことは認めますが(他のコメントルートとの衝突と関係がありますか?)、それはあなたの問題を説明しています。

次のように、コメント リソースにコレクション アクションを定義することもできます。

map.resources :users do |user|
  user.resources :posts
  user.resources :comments, :collection => {:received => :get}
end

これにより、次のルートが得られます。

                 users GET /users                             {:action=>"index", :controller=>"users"}
            user_posts GET /users/:user_id/posts              {:action=>"index", :controller=>"posts"}
         user_comments GET /users/:user_id/comments           {:action=>"index", :controller=>"comments"} 
received_user_comments GET /users/:user_id/comments/received  {:action=>"received", :controller=>"comments"}

注: 受け取ったアクションは現在、コメント コントローラーにあります。

于 2009-04-30T08:39:55.707 に答える
0

簡単な解決策は、すべてのコメントを返すカスタム メソッド (getusercomments など) をユーザー コントローラーに追加することです。

def getusercomments
@user = User.find(params[:id])
@comments = @user.posts.comments
end

次に、このメソッドを users-route に追加します。

map.resources :users, :member => { :getusercomments => :get }

その後、次を呼び出して、ユーザーのすべてのコメントを取得できるはずです。

http://some_domain.com/users/123/getusercomments
于 2008-11-24T23:36:20.507 に答える
0

私は告白しなければなりません、私は変数名に少し混乱していますが、最初に、あなたの has_many :through が定義されているすべての方法で機能することに驚いています。ルートを少し脇に置いて、モデルは期待どおりに動作しますか?

次に、変数名が実際に作用する場所です。ルートは複数形に依存しているため、foos バーと bazs が問題の原因であるか、問題を隠している可能性があります。いずれにしても、間違いなく次のように書くことができます。

map.resources :users do |user|
  user.resources :awards
  user.resources :contest_entries do |contest_entry|
    contest_entry.resources :awards
  end
end

私はあなたに与えると信じています:

user_path, user_awards_path, user_contest_entry_path, and user_contest_entry_awards_path.

これが本当にあなたの質問に答えているかどうかはわかりません.foo、bar、およびbazを実際の状況に近いものに変更すると、ここで何が起こっているのかをより明確に把握するのに役立つかもしれません.

于 2008-11-11T23:03:46.403 に答える