I am getting undefined method `[]’ for nil:NilClass
NoMethodError in Users::OmniauthCallbacksController#facebook
undefined method `[]' for nil:NilClass
Rails.root: /home/krishna/picer
Application Trace | Framework Trace | Full Trace
app/models/user.rb:13:in `find_for_facebook_oauth'
app/controllers/users/omniauth_callbacks_controller.rb:4:in `facebook'
This is my user.rb code
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable:omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:omniauthable
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :remember_me
def self.find_for_facebook_oauth(access_token, signed_in_resource=nil)
data = access_token['extra']['user_hash']
if user = User.find_by_email(data["email"])
user
else # Create a user with a stub password.
User.create(:email => data["email"], :password => Devise.friendly_token[0,20])
end
end
def self.new_with_session(params, session)
super.tap do |user|
if data = session["devise.facebook_data"] && session["devise.facebook_data"] ["extra"]["user_hash"]
user.email = data["email"]
end
end
end
end
And omniauth callbacks controller code
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def facebook
# You need to implement the method below in your model
@user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)
if @user.persisted?
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook"
sign_in_and_redirect @user, :event => :authentication
else
session["devise.facebook_data"] = env["omniauth.auth"]
redirect_to new_user_registration_url
end
end
def passthru
render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false
end
end
I am getting error line four user.rb I used a example for this https://github.com/ryanatwork/devise-omniauth
You should get the user email with
access_token['info']['email']instead ofaccess_token['extra']['user_hash']['email'].I don’t think the data in
access_token['extra']follows a convention like the rest, so you should be extra careful and test if the property you’re trying to access exists. It’s not that important if you only have one provider, but it is if you have several of them.