Rails:request.remote_id返回六位数字

时间:2014-11-03 20:29:43

标签: ruby-on-rails ruby ruby-on-rails-4 ip ip-address

我试图建立一个不会让一个用户投票两次的投票功能,但我不想让任何人登录,所以我想记录一个用户'的IP地址并禁止它。我做了以下事情:

查看:

<%= link_to "vote", vote_user_path(@user), method: :post, :class => "btn" %>

控制器:

def vote
  @user = User.find(params[:id])
  Vote.create!(ip: request.remote_ip, voteable_id: params[:id], voteable_type: "User")
  redirect_to @user
end

但由于某种原因,Vote.last.ip返回&#34; 127.0.0.1&#34;。我的意思是,我对IP地址了解不多,但它不应该是一个六位数的数字,对吗?我做错了什么,或者由于某种原因它是不同的,因为我处于开发模式?

2 个答案:

答案 0 :(得分:3)

127.0.0.1不是六位数字,而是localhost的IP地址。

如果你在测试它的同一台机器上运行rails应用程序服务器,那么这就是你获得127.0.0.1的原因。如果您从可访问网络内的其他计算机上测试了您的应用程序,那么您应该看到准确的IP。

有关详细信息,请参阅remote_ip上的文档。

就IP设计的限制而言,如果用户落后于NAT,那么您将不仅禁止一个用户。在确定设计之前,我确定你必须考虑过这个问题。

答案 1 :(得分:1)

IPv4地址通常用点十进制表示法编写,它由地址的四个八位字节组成,以十进制表示,并以句点分隔,例如:250.199.354.123

在大多数计算机系统上,localhost解析为地址127.0.0.1,这是最常用的IPv4环回地址。

remote_ip确定原始IP地址,在您的情况下是localhost。如前所述,它解析为地址127.0.0.1

如果您从运行服务器的设备投票,

request.remote_ip将返回字符串"127.0.0.1"

您应该知道很容易让其他IP欺骗,或者丢失同一网络上众多有效用户的投票(具有相同的IP地址)。