user_signed_in rails español ruby-on-rails authentication devise

ruby on rails - rails - ¿Qué es la variable devise_mapping y cómo puedo incluirla?



devise wiki (4)

Estoy intentando implementar la autenticación con Devise en mi aplicación Rails (Rails 2.3.8, Devise 1.0.7, mongrel que se ejecuta en Windows Vista). Pero estoy recibiendo el siguiente error:

undefined local variable or method `devise_mapping'' for #<ActionView::Base:0x6d63890>

Esto es cuando uso el _devise_links.html parcial generado automáticamente.

<%- if controller_name != ''sessions'' %> <%= link_to t(''devise.sessions.link''), new_session_path(resource_name) %><br /> <% end -%> <%- if devise_mapping.registerable? && controller_name != ''registrations'' %> <%= link_to t(''devise.registrations.link''), new_registration_path(resource_name) %><br /> <% end -%> <%- if devise_mapping.recoverable? && controller_name != ''passwords'' %> <%= link_to t(''devise.passwords.link''), new_password_path(resource_name) %><br /> <% end -%> <%- if devise_mapping.confirmable? && controller_name != ''confirmations'' %> <%= link_to t(''devise.confirmations.link''), new_confirmation_path(resource_name) %><br /> <% end -%> <%- if devise_mapping.lockable? && controller_name != ''unlocks'' %> <%= link_to t(''devise.unlocks.link''), new_unlock_path(resource_name) %><br /> <% end -%>

¿Alguna idea sobre cómo solucionar este problema? Supongo que la variable devise_mapping no se incluye en mis vistas, pero ¿qué hago al respecto?


¿Tiene el nombre devise_for en su archivo route.rb?

Por ejemplo, si lo está utilizando para su clase de usuario, entonces la ruta sería:

devise_for: usuarios

Para obtener más información, consulte https://github.com/plataformatec/devise


En lugar de usar devise_mapping , puede usar Devise.mappings[:user] , dado que la clase de usuario en cuestión es User.


Me doy cuenta de que esta pregunta es algo vieja, pero creo que me di cuenta de por qué no puedes hacer eso en forma parcial. El parcial que está intentando representar es el parcial de los enlaces que se muestran debajo del formulario de inicio de sesión / inicio de sesión.

Si desea agregar esos enlaces a su aplicación, esta página en la Wiki de Devise le mostrará cómo hacerlo, e implica la creación de sus propios parciales.

EDITAR (2019-04-01): Copiando la información de la página de la wiki de Devise aquí para persistencia.

Cómo: Agregar los enlaces de inicio de sesión, inicio de sesión y inicio de sesión a la plantilla de diseño

Primero agregue los enlaces de inicio de sesión / salida, por lo que el apropiado se mostrará dependiendo de si el usuario ya ha iniciado sesión:

# views/devise/menu/_login_items.html.erb <% if user_signed_in? %> <li> <%= link_to(''Logout'', destroy_user_session_path, method: :delete) %> </li> <% else %> <li> <%= link_to(''Login'', new_user_session_path) %> </li> <% end %> El method: :delete parte es obligatorio si utiliza el método HTTP predeterminado. Para cambiarlo, deberás decirle a Devise esto:

# config/initializers/devise.rb # The default HTTP method used to sign out a resource. Default is :delete. config.sign_out_via = :get Luego puede omitir el method: :delete en todos sus enlaces de inicio de sesión. Luego vienen los enlaces de inicio de sesión. Nuevamente, estos pueden ser sustituidos por otra cosa útil si el usuario ya ha iniciado sesión:

# views/devise/menu/_registration_items.html.erb <% if user_signed_in? %> <li> <%= link_to(''Edit registration'', edit_user_registration_path) %> </li> <% else %> <li> <%= link_to(''Register'', new_user_registration_path) %> </li> <% end %> Luego use estas plantillas en su layouts/application.html.erb , como esto:

# layouts/application.html.erb <ul class="hmenu"> <%= render ''devise/menu/registration_items'' %> <%= render ''devise/menu/login_items'' %> </ul> <%= yield %> Agregue un poco de estilo de menú al CSS (aquí para un menú horizontal):

ul.hmenu { list-style: none; margin: 0 0 2em; padding: 0; } ul.hmenu li { display: inline; }


Puede agregar métodos de ayuda a ApplicationHelper . Asegúrese de usar el nombre de modelo adecuado (en mi caso es :user representa el modelo de User ).

def devise_mapping Devise.mappings[:user] end def resource_name devise_mapping.name end def resource_class devise_mapping.to end

Actualización 1/28/2014

La rama principal de Devise muestra que devise_mapping ahora está almacenado en la solicitud:

# Attempt to find the mapped route for devise based on request path def devise_mapping @devise_mapping ||= request.env["devise.mapping"] end

Y resource_name tiene un alias como scope_name . Ver devise_controller.rb para más información.