我正在尝试实现一个投票系统,其中投票受到选民 ip_address 的限制。
我有一个帖子模型,其中有很多投票,并且投票属于该帖子模型。
我的问题是如何以及在哪里定义“current_user”以及如何在 View 中实现它。
目前我正在创建这样的投票:
<%= link_to(post_votes_path(post), :method => 'post') do %>
<%= song.votes.size %>
工作正常,除了任何人都可以投票,我想阻止这种情况。拜托,我不是在寻找 gem ,我只是想从头开始学习这个功能。
干杯。
这是我的帖子 Controller 代码:
def create
@post = Post.new(params[:post])
respond_to do |format|
if @post.save
format.html { redirect_to root_url, notice: 'Post was successfully created.' }
else
format.html { render action: "new" }
end
end
end
并为创建操作投票 Controller 代码:
def create
@post = Post.find(params[:post_id])
@vote = @post.votes.create
respond_to do |format|
format.html { redirect_to root_url }
#format.js
end
end
最佳答案
就像 MrYoshiji 建议的那样,您应该在投票表中添加 voter_ip 列。
您可以将此 AR where
子句添加到您的帖子/投票 Controller
if @post.votes.where(voter_ip: request.remote_ip).empty?
@post.votes.create(vote: params[:post_vote])
end
这将检查该帖子是否有来自当前 IP 的投票。如果没有记录投票,则会添加一个新投票,其参数值为 post_vote
如果您希望向投票
模型添加约束,则需要进行范围验证。
validates_uniqueness_of :voter_ip, scope: :post_id
使用范围参数时,唯一性约束将应用于 voter_ip
和 post_id
的组合,而不是单独应用于 voter_ip
。
关于ruby-on-rails - 每个IP地址一票,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17477634/