每个IP地址一个投票

时间:2013-07-04 20:19:44

标签: ruby-on-rails ruby

我正在尝试实施投票系统,投票受到选民ip_address的限制。

我有一个帖子模型,其中包含many_votes且投票属于post模型。

我的问题是我如何以及在何处定义“current_user”以及如何在视图中实现此功能。

目前我正在创建这样的投票:

<%= link_to(post_votes_path(post), :method => 'post') do %>
<%= song.votes.size %>

工作正常,除非任何人都可以投票,我想阻止它。请不要寻找宝石我只是想从头开始学习这个功能。

干杯。

这是我的帖子控制器代码:

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

并为create action投票控制器代码:

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

2 个答案:

答案 0 :(得分:1)

ip列中的投票表需要具有唯一的验证约束。如果您尝试为每个ip记录多个投票,则控制器的保存将失败,您可以检测并使用它来闪烁错误。您必须发布控制器代码才能获得更好的答案。

答案 1 :(得分:1)

就像MrYoshiji建议的那样,你应该在你的投票表中添加一个voter_ip列。

您可以将此AR where子句添加到您的帖子/投票控制器

if @post.votes.where(voter_ip: request.remote_ip).empty?
  @post.votes.create(vote: params[:post_vote])
end

这将检查此帖子是否有来自当前ip的任何投票。如果未记录投票,则添加新投票,其参数值为post_vote

如果您希望向vote模型添加约束,则需要进行范围验证。

validates_uniqueness_of :voter_ip, scope: :post_id

使用范围参数时,唯一性约束将应用于voter_ippost_id的组合,而不是voter_ip