-3
class SessionsController < ApplicationController    
  def create    
    auth = request.env["omniauth.auth"]
    user = User.find_by_provider_and_uid(auth["provider"],auth["uid"]) || 
           User.create_with_omniauth(auth)
    session[:user_id]=user.id
    redirect_to("/sessions/sign")
  end

  def sign  

  end    
end

这是在用户模型中

class User < ActiveRecord::Base
  attr_accessible :name, :provider, :uid

  def self.create_with_omniauth(auth)
    create! do |user|
      user.provider=auth["provider"]
      user.uid=auth["uid"]
      user.name=auth["user_info"]["name"]
    end
  end
end

错误:

undefined method '[]' for nil:NilClass

当我通过 facebook 登录时,出现上述错误

4

1 回答 1

2

您需要确保以下内容存在且不存在nil

auth = request.env["omniauth.auth"]

你可以做

auth = request.env["omniauth.auth"]
if auth
  # do stuff
else
  # error handler
end

或者在你的模型中我会检查:

def self.create_with_omniauth(auth)
  return unless auth
  create! do |user|
    user.provider = auth["provider"]
    user.uid      = auth["uid"]
    user.name     = auth["user_info"]["name"]
  end
end

最后,您可以使用该try方法来处理nil值,如下所示:

auth.try(:[], 'provider')

如果authnil则返回nil,否则返回带有键的值provider

于 2013-07-11T08:18:33.523 回答