devise omniauth ruby-on-rails-3.2

devise - Idear el método indefinido Omniauth omniauth_authorize_path



ruby-on-rails-3.2 (6)

Me he dado cuenta de que al iniciar sesión en Devise, he comenzado a recibir estos mensajes de error.

Estoy usando Devise 2.2.4 con Omniauth 1.1.4 y Omniauth-Facebook 1.4.1

¿Alguien sabe cuál es la causa de este error?

ActionView::Template::Error (undefined method `omniauth_authorize_path'' for #<#<Class:0xb85e534>:0xb904e5c>): 21: <%- if devise_mapping.omniauthable? %> 22: <%- resource_class.omniauth_providers.each do |provider| %> 23: <% logger.info "hey #{provider} , dolphin and #{resource_name}" %> 24: <%= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider) %><br /> 25: <% end -%> 26: <% end -%> app/views/devise/shared/_links.erb:24:in `block in _app_views_devise_shared__links_erb___1039642231_94147460'' app/views/devise/shared/_links.erb:22:in `each'' app/views/devise/shared/_links.erb:22:in `_app_views_devise_shared__links_erb___1039642231_94147460'' app/views/devise/sessions/new.html.erb:17:in `_app_views_devise_sessions_new_html_erb__883448937_92868060''


Un posible error es que la configuración de omniauth está configurada en el lugar equivocado.

Me encontré con este error porque configuré mis cuentas de Facebook en config/initializers/omniauth.rb , como lo indica el readme de omniauth.

Sin embargo, tenemos que configurarlo a través de idee, es decir, config/initializers/devise.rb en la sección omniauth.


Empecé a recibir este error hoy (27 de julio de 2016) cuando actualicé a Ruby 2.3.1 y Rails 4.2.7. La solución que funcionó para mí fue cambiar todas las instancias de user_omniauth_authorize_path(:twitter) a user_twitter_omniauth_authorize_path .


Tratar

user_omniauth_authorize_path(provider)

Supongo que tiene una clase de usuario y en su archivo de rutas tiene

devise_for :users


Hazlo así

<%- if devise_mapping.omniauthable? %> <%- resource_class.omniauth_providers.each do |provider| %> <%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", public_send("user_#{provider.to_s}_omniauth_authorize_path") %><br /> <% end -%> <% end -%>

Esto hace que sea utilizable para múltiples proveedores, pero supone que está utilizando

devise_for :users

Pero yendo aún más lejos, también podrías agregar

resource_class.name.downcase

para cubrir no solo al usuario

<%- if devise_mapping.omniauthable? %> <%- resource_class.omniauth_providers.each do |provider| %> <%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", public_send("#{resource_class.name.downcase}_#{provider.to_s}_omniauth_authorize_path") %><br /> <% end -%> <% end -%>

Si devise_for es para los usuarios y el proveedor es Facebook, entonces creará la ruta:

user_facebook_omniauth_authorize_path

si devise_for es admins y provider twitter, entonces creará ruta:

admin_twitter_omniauth_authorize_path



En su aplicación / vistas / idear / compartido / _links.erb:

cambio

omniauth_authorize_path

a

user_omniauth_authorize_path(provider)