Ruby on rails 将用户IP记录到RoR中的数据库

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

我已经为这个问题挣扎了很多年,所有相关的问题似乎都没有用。我试图通过一个隐藏字段收集用户的IP,然后将其显示在相应的消息中。当我尝试实现它时,我的表单页面上出现以下错误。我不确定这是由于更新表的问题还是什么原因造成的,但是当我运行Message.all时,ip值没有出现 以下是相关代码的代码: 运行消息时的控制台。全部:

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本地主机的标准缩写