I've been following the omniauth + devise integration guide for facebook and I keep getting this error when I click the link to sign in with facebook link.
undefined method user_omniauth_authorize_path
for #<#<Class:0x0000000253a550>:0x000000035ea490>
I've double checked the code in the guide and I can't seem to figure out what the issue is. My gemfile:
source 'https://rubygems.org'
gem 'sendgrid'
gem 'omniauth-facebook'
gem 'gravatar'
gem 'will_paginate'
gem 'faker'
gem 'devise'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.6'
# Use postgresql as the database for Active Record
gem 'pg', '~> 0.15'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.1.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby
# Use jquery as the JavaScript library
gem 'jquery-rails'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.0'
# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', '~> 0.4.0', group: :doc
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'
# Use Unicorn as the app server
# gem 'unicorn'
# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug'
end
group :development do
# Access an IRB console on exception pages or by using <%= console %> in views
gem 'web-console', '~> 2.0'
gem 'letter_opener'
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring'
end
OmniauthCallbacksController:
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def facebook
@user = User.from_omniauth(request.env["omniauth"])
if @user.persisted?
sign_in_and_redirect @user, :event => :authentication
set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format?
else
session["devise.facebook_data"] = request.env["omniauth.auth"]
redirect_to new_user_registration_url
end
end
def failure
redirect_to root_path
end
end
User Model:
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:omniauthable, :omniauth_providers => [:facebook]
has_many :likings, dependent: :destroy
has_many :comments, dependent: :destroy
has_many :posts, dependent: :destroy
has_many :active_relationships, class_name: "Relationship",
foreign_key: "follower_id",
dependent: :destroy
has_many :passive_relationships, class_name: "Relationship",
foreign_key: "followed_id",
dependent: :destroy
has_many :following, through: :active_relationships, source: :followed
has_many :followers, through: :passive_relationships, source: :follower
def feed
Post.where("user_id IN (?) OR user_id = ?", following_ids, id)
end
# follows user
def follow(other_user)
active_relationships.create(followed_id: other_user.id)
end
# unfollows user
def unfollow(other_user)
active_relationships.find_by(followed_id: other_user.id).destroy
end
def following?(other_user)
following.include?(other_user)
end
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.email = auth.info.email
user.password = Devise.friendly_token[0,20]
end
end
end
Try running rake routes and see what the paths for omniauth are. I believe they have changed with the most recent release of devise. Try changing
<%= link_to "Sign in with Facebook", user_omniauth_authorize_path(:facebook) %>
to
<%= link_to "Sign in with Facebook", user_facebook_omniauth_authorize_path %>
and see if that works for you.
Apparently the helpers for the omniauth routes have changed since the rake routes command for me returned
user_facebook_omniauth_authorize GET|POST /users/auth/facebook(.:format) omniauth_callbacks#passthru
and not as it was some months ago when I started the project.
user_omniauth_authorize GET|POST /users/auth/facebook(:provider) omniauth_callbacks#passthru
You should also change the line
@user = User.from_omniauth(request.env["omniauth"])
to
@user = User.from_omniauth(request.env["omniauth.auth"])
This is what worked for me, hope this helps.
It might not be the answer people are looking for, but you could always just specify an older version of the devise gem in your Gemfile.
gem 'devise', '~> 4.1.1'
This took down my production site and I had to act quick. This worked.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With