J'essaye d'utiliser une mise en page différente / personnalisée nommée "devise" pour l'action sign_in. J'ai trouvé cette page dans le wiki de conception, et le deuxième exemple dit même que vous pouvez le faire par action (dans ce cas, sign_in
action), mais il ne montre aucun exemple de le faire. Quelqu'un sur IRC m'a dit que je pouvais essayer ceci:
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
Mais cela ne semble pas fonctionner car il charge toujours la mise en page par défaut de l'application. J'apprécierais toute aide.
la source
Je viens de créer app / views / layouts / devise / sessions.html.erb et y mettre ma mise en page.
la source
Je l'ai compris, mais je vais garder cette question ici au cas où d'autres personnes seraient curieuses.
C'était une erreur stupide. Le fait est que
sign_in
c'est le chemin, pas l'action. En regardant la source pertinente , je peux voir que l'action requise estnew
, c'est-à-dire, la création d'une nouvelle Devise Session. Changer le conditionnel de mon code ci-dessus en:if devise_controller? && resource_name == :user && action_name == 'new'
Fonctionne à merveille.
J'espère que cela aide quelqu'un là-bas.
la source
La solution de loin la plus simple consiste simplement à créer une mise en page appelée devise.html.haml dans votre dossier app / views / layouts. et la magie Rails s'occupe du reste.
la source
Voilà comment je l'ai fait. Je voulais une mise en page différente si l'utilisateur devait se connecter, mais une mise en page différente si l'utilisateur devait modifier son profil.
J'utilise Rails 4.1.1
Dans le contrôleur d'application, ajoutez ceci:
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
la source
Surpris de ne voir cette réponse nulle part, mais vous pouvez aussi le faire:
Dans routes.rb, modifiez la configuration de votre appareil pour ressembler à ceci:
devise_for :users, controllers: { sessions: 'sessions' }
Puis dans app / controllers / sessions_controller.rb
class SessionsController < Devise::SessionsController layout 'devise', only: [:new] end
Ceci est particulièrement utile si vous devez effectuer des remplacements de logique supplémentaires dans l'un des contrôleurs Devise.
la source
Juste au cas où vous ne le saviez pas, vous pouvez également utiliser
rake routes
pour voir les itinéraires dans votre application de rails avec l'action / le contrôleur auquel ils sont mappés.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"}
la source
Voici une ligne unique pour ceux qui souhaitent que toutes les actions de conception utilisent une nouvelle mise en page:
class ApplicationController < ActionController::Base protect_from_forgery layout Proc.new { |controller| controller.devise_controller? ? 'devise' : 'application' } end
la source