【问题标题】:Unless statement in Rails controller?除非在 Rails 控制器中声明?
【发布时间】:2012-08-10 17:49:07
【问题描述】:

我的 Rails 3 应用程序控制器中有以下代码:

  def like
    @suggestion = Suggestion.find(params[:id])
    @suggestion.voteip = request.env['REMOTE_ADDR']
    @suggestion.update_attribute(:votes, @suggestion.votes + 1)
    redirect_to suggestions_url
  end

  def dislike
    @suggestion = Suggestion.find(params[:id])
    @suggestion.voteip = request.env['REMOTE_ADDR']
    @suggestion.update_attribute(:votes, @suggestion.votes - 1)
    redirect_to suggestions_url
  end

如您所见,代码将投票整数递增/递减 1,并将用户 IP 地址添加到名为 voteip 的列中。

我想要实现的是一个简单的阻止来自同一 IP 的投票连续两次。因此,例如,如果我的 IP 是 123.123.123.123 并且我对某事进行了投票,那么我就不能从同一个 IP 地址再次对相同的建议进行投票(无论是向上还是向下)。

这是一种非常简单且远非万无一失的限速投票方法。虽然,在将要使用的环境中,它几乎是完美的!

一旦我完成这项工作,我计划为投票时间戳添加另一列,然后我可以做一些事情,比如只允许在 5 分钟后从同一个 IP 投票。

任何建议将不胜感激!

【问题讨论】:

    标签: ruby-on-rails-3 controller ip limit vote


    【解决方案1】:

    一种方法是找到具有REMOTE_ADDR ip的最后一票。

    将此添加到您的控制器中。

    def like
      @suggestion = Suggestion.find(params[:id])
      remote_addr = request.env['REMOTE_ADDR']
    
      @last_vote = Suggestion.find_ip(remote_addr).last
    
      if @last_vote.created_at < 2.minutes.ago
        render :text => "get lost"
      else
        @suggestion.voteip = remote_addr
        @suggestion.update_attribute(:votes, @suggestion.votes + 1)
        redirect_to suggestions_url
      end
    end
    

    并将其添加到您的建议模型中

    def self.find_ip(ip)
      where('voteip = ?', "#{ip}")
    end
    

    我创建了一个快速应用程序并对其进行了测试,因此它确实可以工作。当然,您可以将2.minutes.ago 更改为您想要的任何时间范围。

    希望这会有所帮助!

    【讨论】:

    • 如果我创建一个名为 voted_at 的列,我是否认为 @last_vote.created_at 可以更改为 last_vote.voted_at?目前,建议表中唯一与投票相关的是投票列。
    • 嗯,你可以,但@last_vote 会找到指定 IP 投票的最后一个建议。然后,如果 last_vote 是在不到 2 分钟前创建的,那么它将呈现文本说“迷路”或做任何你想做的事情
    • 但是,你不应该添加我认为不需要的另一列 :)
    • 我有点困惑,因为我只为建议本身创建了_at,而不是为投票。 :S
    • 你创建的每个模型都有 created_at 和 updated_at 字段
    【解决方案2】:

    投票实际上是一个单独的资源。特别是如果你想在未来实现一个更强大的系统,你会希望你的投票是一个单独的表,通过 has_many 关系。通过这种方式,可以非常容易地比较特定 ip 的最后一次投票发生的时间(用作索引,或者用户是否通过了 user_id 的身份验证)。这也允许您为 IP/用户创建投票历史。

    用户/ip 有很多建议,有很多投票。只是我的两分钱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多