mise en page différente pour signer dans l’action

J’essaie d’utiliser une disposition différente / personnalisée nommée “devise” pour l’action sign_in. J’ai trouvé cette page dans le wiki du concept, et le deuxième exemple dit même que vous pouvez le faire par action (dans ce cas, action sign_in ), mais cela ne montre aucun exemple de ce type. 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 disposition de l’application par défaut. J’apprécierais toute aide.

    Une autre méthode pour appliquer une disposition personnalisée à une action est la suivante.

    Selon Comment: créer des mises en page personnalisées “Vous pouvez également définir la disposition de contrôleurs Devise spécifiques en utilisant un rappel dans config / environment.rb (rails 2) ou config / application.rb (rails 3). Cela doit être fait dans un to_prepare callback car il est exécuté une fois en production et avant chaque requête en développement. ”

     config.to_prepare do Devise::SessionsController.layout "devise" Devise::RegistrationsController.layout proc{ |controller| user_signed_in? ? "application" : "devise" } Devise::ConfirmationsController.layout "devise" Devise::UnlocksController.layout "devise" Devise::PasswordsController.layout "devise" end 

    Généralement, une distinction de mise en page est faite entre les pages derrière la connexion et les pages qui ne nécessitent pas d’authentification. L’approche ci-dessus fonctionne donc la plupart du temps. Mais j’ai également expérimenté l’utilisation de helper action_name pour définir une disposition pour une action particulière et cela fonctionnait comme un charme:

     config.to_prepare do Devise::SessionsController.layout proc{ |controller| action_name == 'new' ? "devise" : "application" } end 

    Je pense que c’est la meilleure façon de modifier la disposition en fonction du contrôleur / de l’action au lieu de créer une aide dans ApplicationController.

    Je viens de créer app / views / layouts / invent / sessions.html.erb et d’y placer ma mise en page.

    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 est le chemin, pas l’action. En regardant la source pertinente , je peux voir que l’action requirejse est new , c’est-à-dire créer une nouvelle session Devise. Modifier la condition de mon code ci-dessus à:

     if devise_controller? && resource_name == :user && action_name == 'new' 

    Fonctionne magnifiquement.

    J’espère que ça aide quelqu’un dehors.

    C’est comme ça que je l’ai fait. Je voulais une mise en page différente si l’utilisateur devait se connecter, mais une disposition 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 solution de loin la plus simple consiste à créer simplement une mise en page nommée devise.html.haml dans votre dossier app / views / layouts. et la magie Rails prend soin du rest.

     app/views/layouts/devise.html.haml 

    Surpris de ne pas voir cette réponse nulle part, mais vous pouvez aussi le faire:

    Dans routes.rb, changez votre configuration 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 

    Cela est particulièrement utile si vous devez effectuer des remplacements logiques supplémentaires dans les contrôleurs Devise.

    Juste au cas où vous ne le saviez pas, vous pouvez également utiliser les rake routes pour voir les routes dans votre application rails avec l’action / le contrôleur auquel elles correspondent.

      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"} 

    Voici un traceur pour ceux qui veulent tous concevoir des actions pour utiliser une nouvelle mise en page:

     class ApplicationController < ActionController::Base protect_from_forgery layout Proc.new { |controller| controller.devise_controller? ? 'devise' : 'application' } end