0

Rails 3 と Devise 2.0 を使用しています

Posts リソースの index ビューに、current_user が投票していない限り、投票ボタンを表示したいと考えています。

@posts = Post.all を index ビューに渡すだけです。各投稿をチェックして current_user が既に投票しているかどうかを確認し、それに応じてビューをレンダリングする最良の方法は何ですか?

現在、Post モデルにメソッドを作成してこれを実行しようとしていますvoted?が、 current_user メソッドはそこで利用できません。

私が見るもう1つの解決策はif letter.votes.find_by_user_id(current_user.id)、インデックスビューにあることですが、これがビューロジックに属しているかどうかはわかりません。

4

2 に答える 2

3

良い解決策の 1 つはPost、次のようにモデルまたはヘルパーにメソッドを実装することです (post has_many 票を想定):

def voted?(user)
  !votes.find_by_user_id(user.id).empty?
end

次に、ビューに置くことができますif post.voted?(current_user)

おっしゃるとおり、ロジックはモデルに属しており、モデルは、現在のユーザーなど、モデルの外部にあるものについて何の知識も持っていません (また、そうすべきでもありません)。引数として渡す必要があります

于 2012-06-17T02:43:21.947 に答える
1

Post、 、VoteおよびUserモデルがあります

そして、投稿が特定のユーザーからいつ投票されたかを知りたい

それを行う1つの方法はジャスティンの方法かもしれませんが、それは必要以上に多くのデータベースクエリを生成します

より良い解決策は、次のhas_many :throughような関連付けを使用することです。

class Post
  has_many :votes
  has_many :voted_users, through: :votes, source: :user
end

そして今、あなたは電話をかけることができます@posts = Post.includes(:voted_users)

これにより、各投稿に投票したすべてのユーザーが熱心に読み込まれます

そして、あなたはただ言うことができます

if post.voted_users.include? current_user
  #do stuff
end
于 2012-06-17T07:49:23.883 に答える