Estoy tratando de usar un diseño diferente / personalizado llamado "devise" para la acción sign_in. Encontré esta página en la wiki de devise, y el segundo ejemplo incluso dice que puedes hacerlo por acción (en este caso, sign_in
acción), pero no muestra ningún ejemplo de cómo hacerlo. Alguien en IRC me dijo que podía probar esto:
class ApplicationController < ActionController::Base
protect_from_forgery
layout :layout_by_resource
def layout_by_resource
if devise_controller? && resource_name == :user && action_name == 'sign_in'
"devise"
else
"application"
end
end
end
Pero parece que no funciona ya que todavía está cargando el diseño de aplicación predeterminado. Apreciaría cualquier ayuda.
fuente
Acabo de crear app / views / layouts / devise / sessions.html.erb y puse mi diseño allí.
fuente
Lo descubrí, pero mantendré esta pregunta aquí en caso de que otras personas sientan curiosidad.
Fue un error estúpido. El hecho es que
sign_in
es el camino, no la acción. Mirando la fuente relevante , puedo ver que la acción requerida esnew
, es decir, crear una nueva sesión de Devise. Cambiar el condicional de mi código anterior a:if devise_controller? && resource_name == :user && action_name == 'new'
Funciona maravillosamente.
Espero que eso ayude a alguien.
fuente
La solución, con mucho, más simple es simplemente crear un diseño llamado devise.html.haml en su carpeta app / views / layouts. y la magia de Rails se encarga del resto.
fuente
Así es como lo hice. Quería un diseño diferente si el usuario tenía que iniciar sesión, pero un diseño diferente si el usuario tenía que editar su perfil.
Estoy usando Rails 4.1.1
En el controlador de la aplicación, agregue esto:
class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception before_action :configure_permitted_parameters, if: :devise_controller? layout :layout_by_resource # Define the permitted parameters for Devise. protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:firstname, :lastname, :email, :password, :password_confirmation)} devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:avatar, :firstname, :lastname, :email, :password, :password_confirmation, :current_password) } end def layout_by_resource if devise_controller? and user_signed_in? 'dashboard' else 'application' end end end
fuente
Sorprendido de no ver esta respuesta en ningún lado, pero también puede hacer esto:
En route.rb, cambie la configuración de su dispositivo para que se vea así:
devise_for :users, controllers: { sessions: 'sessions' }
Luego, en app / controllers / sessions_controller.rb
class SessionsController < Devise::SessionsController layout 'devise', only: [:new] end
Esto es especialmente útil si necesita hacer anulaciones lógicas adicionales en cualquiera de los controladores de Devise.
fuente
En caso de que no lo supiera, también puede usar
rake routes
para ver las rutas en su aplicación de rieles junto con la acción / controlador al que se asignan.new_user_registration GET /accounts/sign_up(.:format) {:action=>"new", :controller=>"devise/registrations"} edit_user_registration GET /accounts/edit(.:format) {:action=>"edit", :controller=>"devise/registrations"} PUT /accounts(.:format) {:action=>"update", :controller=>"devise/registrations"} DELETE /accounts(.:format) {:action=>"destroy", :controller=>"devise/registrations"}
fuente
Aquí hay un resumen para aquellos que quieren que todas las acciones de diseño usen un nuevo diseño:
class ApplicationController < ActionController::Base protect_from_forgery layout Proc.new { |controller| controller.devise_controller? ? 'devise' : 'application' } end
fuente