私のレールアプリには、ユーザーがピンに賛成票を投じることができる賛成票システムがあります。しかし、ピンに 1 回だけ賛成票を投じる機能を制限したいと思います。
app/controllers/pins_controller.rb
def upvote
@pin = Pin.find(params[:id])
@pin.votes.create
redirect_to(pins_path)
end
アプリ/モデル/pin.rb
class Pin < ActiveRecord::Base
belongs_to :user
has_many :votes, dependent: :destroy
has_attached_file :image, :styles => { :medium => "300x300>", :thumb => "100x100>" }
has_attached_file :logo, :styles => { :medium => "300x300>", :thumb => "100x100>" }
end
app/config/routes.rb
resources :pins do
member do
post 'upvote'
end
end
ユーザーが1回だけ賛成票を投じることができるシステムを実装しようとしたので、それを実装する方法がわかりません。act_as_votableジェムがこの機能を提供することは知っていますが、私はそれを使用していないので、自分のコードにそれを実装する方法があるかどうか知りたいと思っていました。
何か案は?
更新: この方法では、ピンごとに 1 票しか許可されません。@Egeソリューションを参照
これで動作するようにします:
def upvote
@pin = Pin.find(params[:id])
if @pin.votes.count == 0
@pin.votes.create
redirect_to(pins_path)
else flash[:notice] = "You have already upvote this!"
redirect_to(pins_path)
end
end