Ruby on rails 将用户IP记录到RoR中的数据库
我已经为这个问题挣扎了很多年,所有相关的问题似乎都没有用。我试图通过一个隐藏字段收集用户的IP,然后将其显示在相应的消息中。当我尝试实现它时,我的表单页面上出现以下错误。我不确定这是由于更新表的问题还是什么原因造成的,但是当我运行Message.all时,ip值没有出现 以下是相关代码的代码: 运行消息时的控制台。全部:Ruby on rails 将用户IP记录到RoR中的数据库,ruby-on-rails,ruby,Ruby On Rails,Ruby,我已经为这个问题挣扎了很多年,所有相关的问题似乎都没有用。我试图通过一个隐藏字段收集用户的IP,然后将其显示在相应的消息中。当我尝试实现它时,我的表单页面上出现以下错误。我不确定这是由于更新表的问题还是什么原因造成的,但是当我运行Message.all时,ip值没有出现 以下是相关代码的代码: 运行消息时的控制台。全部: irb(main):002:0> Message.all Message Load (2.6ms) SELECT "messages".* FROM "messag
irb(main):002:0> Message.all
Message Load (2.6ms) SELECT "messages".* FROM "messages"
=> #<ActiveRecord::Relation [#<Message id: 30, subject: "Pears", content: "Pears", post_time: nil, created_at: "2015-07-02 19:49:32", updated_at: "2015-07-02 19:49:32">, #<Message id: 31, subject: "Pears", content: "Pears\r\n", post_time: nil, created_at: "2015-07-14 17:49:12", updated_at: "2015-07-14 17:49:12">, #<Message id: 32, subject: "Hi", content: "Muffin", post_time: nil, created_at: "2015-07-14 17:52:23", updated_at: "2015-07-14 17:52:23">]>
irb(main):003:0>
消息模型的迁移文件:
class CreateMessages < ActiveRecord::Migration
def change
create_table :messages do |t|
t.string :subject
t.string :content
t.string :ip
t.date :post_time
t.timestamps null: false
end
end
end
消息控制器:
class MessagesController < ApplicationController
def index
@messages=Message.all
end
def new
@messages=Message.new
end
def show
@message=Message.find(params[:id])
end
def destroy
@messages=Message.find(params[:id])
@messages.destroy
redirect_to '/'
end
def create
@messages = Message.new(message_params)
if @messages.save
redirect_to '/'
else
render 'new'
end
end
private
def message_params
params.require(:message).permit(:content, :subject, :id, :ip)
end
end
@message = Message.new(message_params)
@message.ip = request.remote_ip
@message.save
提交邮件视图:
<div class="formWrapper">
<%=form_for Message.new do |t|%>
<div class ="Inputs">
<div class="row">
<div class="input-field col s6">
<%=t.text_field :subject, :class => "validate", :length => '25', :placeholder => 'Subject'%><br>
<%=t.text_area :content, :class => "materialize-textarea", :placeholder => "Message"%>
<%=t.hidden_field :ip, :value => request.remote_ip %>
<div class="g-recaptcha" data-sitekey=""></div>
</div>
</div>
<div class="submit">
<%=t.submit "Submit", :class => "btn"%>
</div>
<%end%>
</div>
</div>
显示消息的索引页:
<div class="main">
<%@messages.each do |t|%>
<div class="cWrap">
<div class="col s12 m6">
<div class="card blue-grey darken-1">
<div class="card-content white-text">
<span class="card-title"><%=link_to t.subject, show_path(t)%></span>
<div class="divider"></div>
<p><%=t.content%></p>
<p><%=t.ip%></p>
</div>
<div class="card-action">
<%=link_to "Delete Message", delete_path(t), :method => 'delete'%>
</div>
</div>
</div>
</div>
<% end %>
</div>
首先,这是一个非常糟糕的主意,每个人都可以直接改变IP的形式,例如通过chrome开发工具。。。在控制器中保存消息之前,最好先设置ip:
class MessagesController < ApplicationController
def index
@messages=Message.all
end
def new
@messages=Message.new
end
def show
@message=Message.find(params[:id])
end
def destroy
@messages=Message.find(params[:id])
@messages.destroy
redirect_to '/'
end
def create
@messages = Message.new(message_params)
if @messages.save
redirect_to '/'
else
render 'new'
end
end
private
def message_params
params.require(:message).permit(:content, :subject, :id, :ip)
end
end
@message = Message.new(message_params)
@message.ip = request.remote_ip
@message.save
接下来,如果您查看控制台
irb(main):002:0> Message.all
Message Load (2.6ms) SELECT "messages".* FROM "messages"
=> #<ActiveRecord::Relation [#<Message id: 30, subject: "Pears", content: "Pears", post_time: nil, created_at: "2015-07-02 19:49:32", updated_at: "2015-07-02 19:49:32">, #<Message id: 31, subject: "Pears", content: "Pears\r\n", post_time: nil, created_at: "2015-07-14 17:49:12", updated_at: "2015-07-14 17:49:12">, #<Message id: 32, subject: "Hi", content: "Muffin", post_time: nil, created_at: "2015-07-14 17:52:23", updated_at: "2015-07-14 17:52:23">]>
irb(main):003:0>
正如我所看到的,您的任何消息中都没有ip属性。我猜您稍后会在迁移文件中添加该字段,然后忘记迁移 您保存的任何邮件是否包含ip?我如何添加该列?创建一个新的迁移rails g migration AdditorMessages,在更改内容中,方法为:add_column:messages,:ip,:string并应用rake db:migrate或rollback当前消息rake db:rollback并再次应用rake db:migrate…好的,我添加了Ip列,但我的消息的Ip列的值是::1,这是本地主机的Rubyese吗?是的,它是本地主机,不是ruby发明,它是ipv6本地主机的标准缩写