我在通过IP创建用户时遇到问题。没有登录,也没有注册,就像Yik Yak一样。我只能在终端中创建用户,但我似乎无法将其转换为代码。
在终端中,我可以通过以下方式成功创建用户:
irb(main):001:0> user=User.new
=> #<User id: nil, current_ip: nil, created_at: nil, updated_at: nil>
irb(main):002:0> user.current_ip="159.5.159.11"
=> "159.5.159.11"
irb(main):003:0> user.save
这就是我现在所拥有的。当我在rails服务器中运行它时,我无法将我的ip保存为新用户。我在这里缺少什么?
的routes.rb
Rails.application.routes.draw do
resources :users
root 'users#create'
users_controller
class UsersController < ApplicationController
before_action :set_user, only: [:show, :edit, :update, :destroy]
cattr_accessor :current_ip
....
def create
@user = User.new(user_params)
@user.current_ip=request.env['REMOTE_ADDR']
@user.save
respond_to do |format|
if @user.save
format.html { redirect_to @user, notice: 'User was successfully created.' }
format.json { render :show, status: :created, location: @user }
else
format.html { render :new }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
application_controller
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
before_filter :set_current_ip
protected
def set_current_ip
@user.current_ip = request.env['REMOTE_ADDR']
end
end
这是我目前得到的错误
追溯到 app / controllers / application_controller.rb:10:在`set_current_ip&#39;
答案 0 :(得分:1)
在我看来,@ user并未设置为&#39; def set_current_ip&#39;中的任何内容。
你可能想做这样的事情(在第4轨中)
def set_current_ip
@user = User.where(current_ip: request.remote_ip).first_or_create
end
重要提示:
通过IP跟踪用户可能会很脆弱。 IP可以改变,通过NAT在路由器后面的多个人都可以拥有相同的IP。
此刻我没有一个很好的替代建议,抱歉!
答案 1 :(得分:0)
您似乎错过了数据库中的current_ip
列。您确定已应用相关迁移吗?您是否尝试重新启动Rails服务器进程以查看是否收到了更改?
注意,请使用request.remote_ip
而不是直接访问ENV
变量。请求的远程IP实际上可以来自多个环境变量之一。