ruby-on-rails - 每个IP地址一票

标签 ruby-on-rails ruby

我正在尝试实现一个投票系统,其中投票受到选民 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_ippost_id 的组合,而不是单独应用于 voter_ip

关于ruby-on-rails - 每个IP地址一票,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17477634/

相关文章:

ruby-on-rails - yarn 安装说是最新的,但无法启动 Rails 控制台

arrays - 如何使用 Ruby 2.3 中引入的 Array#dig 和 Hash#dig?

ruby-on-rails - Rails 中的可选位置

ruby - 为什么在 Ruby 中使用 Marshal 转储和加载哈希会抛出 FormatError?

ruby-on-rails - Elasticsearch排序选项不受支持

ruby-on-rails - 从集合中获取所有 id

javascript - Rails 3触发AJAX提交单选按钮更改正在渲染html响应

ruby-on-rails - 如何传递 simple_form 隐藏字段参数来创建操作

ruby - 输入 "guard"会出现异常

java - 异构数组的意义何在?