仅通过IP保存新用户(匿名,如Yik Yak)

时间:2015-07-08 21:46:58

标签: ruby-on-rails postgresql ruby-on-rails-4

我在通过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

这是我目前得到的错误

enter image description here

追溯到 app / controllers / application_controller.rb:10:在`set_current_ip&#39;

2 个答案:

答案 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实际上可以来自多个环境变量之一。