ruby-on-rails - rails devise google
Devise+Omniauth: método indefinido `user_omniauth_authorize_path '' (2)
He estado siguiendo la guía de integración de omniauth + idee para facebook y sigo recibiendo este error cuando hago clic en el enlace para iniciar sesión con el enlace de Facebook.
método undefined user_omniauth_authorize_path
para #<#<Class:0x0000000253a550>:0x000000035ea490>
He verificado el código en la guía y no puedo entender cuál es el problema. Mi 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
Modelo de usuario:
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
Intente ejecutar rutas de rake y vea cuáles son los caminos para omniauth. Creo que han cambiado con la versión más reciente del dispositivo. Intenta cambiar
<%= link_to "Sign in with Facebook", user_omniauth_authorize_path(:facebook) %>
a
<%= link_to "Sign in with Facebook", user_facebook_omniauth_authorize_path %>
y mira si eso funciona para ti.
Aparentemente los ayudantes para las rutas de omniauth han cambiado desde que el comando de rutas de rastreo para mí regresó
user_facebook_omniauth_authorize GET|POST /users/auth/facebook(.:format) omniauth_callbacks#passthru
y no como lo fue hace algunos meses cuando comencé el proyecto.
user_omniauth_authorize GET|POST /users/auth/facebook(:provider) omniauth_callbacks#passthru
También debes cambiar la línea
@user = User.from_omniauth(request.env["omniauth"])
a
@user = User.from_omniauth(request.env["omniauth.auth"])
Esto es lo que funcionó para mí, espero que esto ayude.
Puede que no sea la respuesta que la gente está buscando, pero siempre puedes simplemente especificar una versión anterior de la gema de diseño en tu Gemfile.
gem ''devise'', ''~> 4.1.1''
Esto anuló mi sitio de producción y tuve que actuar rápido. Esto funcionó.