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
Devise cambió el helper url por ser omniauth_authorize_path(<scope>, <provider>)
En su aplicación / vistas / idear / compartido / _links.erb:
cambio
omniauth_authorize_path
a
user_omniauth_authorize_path(provider)