1

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 からの投票を 2 回続けて単純にブロックすることです。したがって、たとえば、私の IP が123.123.123.123何かに投票した場合、同じ IP アドレスから同じ提案に再度 (上または下に) 投票することはできませんでした。

これは非常に単純で、投票率を制限する絶対確実な方法とは言えません。とはいえ、これから使う環境ではほぼパーフェクト!

これが機能したら、投票のタイムスタンプ用に別の列を追加する予定です。その後、5 分が経過した後に同じ IP からの投票のみを許可するなどのことができます。

アドバイスをいただければ幸いです。

4

2 に答える 2

1

投票は実際には別個のリソースです。特に将来的により堅牢なシステムを実装したい場合は、has_many 関係を通じて、投票を別のテーブルにする必要があります。このようにして、特定のIPによる最後の投票がいつ行われたかを非常に簡単に比較できます(インデックスとして使用されるか、ユーザーが認証されている場合はおそらくuser_idです)。また、これにより、IP/ユーザーの投票履歴を作成できます。

ユーザー/IP には、多くの投票がある多くの提案があります。ちょうど私の2セント。

于 2012-08-11T02:19:04.287 に答える
1

これを行う 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時間枠に変更できます。

お役に立てれば!

于 2012-08-10T20:28:33.737 に答える