Ruby on Railsに関する質問です。
ブログ記事に投票するシステムを作ろうと考えているのですが、モデルのバリデーションをどうかけたら良いかわかりません。
仕様
Post -> Vote(一対多)
User -> Vote(一対多)
ただしUserは同じPostに1度しか投票できない
モデルでバリデーションをかけない場合の実装
# models/user.rb has_many :votes
# models/post.rb has_many :votes
# app/models/vote.rb belongs_to :post belongs_to :user
# app/controllers/posts_controller.rb # POST /posts/:id/vote def vote # そのポストにcurrent_userがすでに投票していたらリダイレクト # 本当はモデルでバリデーションをかけたい # current_userは現在ログインしているUserオブジェクト redirect_to @post if @post.votes.exists?(user_id: current_user.id) vote = @post.votes.build do |v| v.user_id = current_user.id end if vote.save # 省略 else # 省略 end end
コントローラで記事への投票の存在を確認しているので問題がなさそうですが、どうも良い実装だとは思えません。Voteモデルのバリデーションで解決する方法はないでしょうか...?
また、Railsでgemを使わずにこうしたベーシックな投票システムを作るチュートリアルやブログ記事がありましたら教えていただきたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。