layout diverso per sign_in action in idea

Sto cercando di utilizzare un layout diverso / personalizzato denominato “devise” per l’azione sign_in. Ho trovato questa pagina nel wiki di sviluppo, e il secondo esempio dice anche che puoi farlo per azione (in questo caso, sign_in action), ma non mostra alcun esempio di farlo. Qualcuno su IRC mi ha detto che potrei provare questo:

 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 

Ma non sembra funzionare mentre sta ancora caricando il layout dell’applicazione di default. Gradirei qualsiasi aiuto.

Un altro modo per applicare il layout personalizzato per un’azione è il seguente.

Secondo How To: Creare layout personalizzati “È anche ansible impostare il layout per specifici controller Devise utilizzando un callback in config / environment.rb (rails 2) o config / application.rb (rails 3). Questo deve essere fatto in un to_prepare callback perché viene eseguito una volta in produzione e prima di ogni richiesta in fase di sviluppo. ”

 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 

Di solito viene fatta una distinzione tra le pagine dietro l’accesso e le pagine che non richiedono l’autenticazione, quindi l’approccio di cui sopra funziona la maggior parte del tempo. Ma ho anche action_name utilizzare helper action_name per impostare un layout per una determinata azione e ha funzionato come un fascino:

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

Penso che questo sia il modo migliore e costruito per cambiare il layout basato su controller / azione di sviluppo invece di creare un helper in ApplicationController.

Ho appena creato app / views / layouts / devise / sessions.html.erb e ho inserito il mio layout.

L’ho capito, ma terrò questa domanda qui se le altre persone sono curiose.

È stato uno stupido errore. Il fatto è sign_in è il percorso, non l’azione. Guardando la fonte rilevante , posso vedere che l’azione richiesta è new , cioè, creando una nuova Devise Session. Modifica del condizionale del mio codice sopra a:

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

Funziona magnificamente.

Spero che aiuti qualcuno là fuori.

Questo è come l’ho fatto. Volevo un layout diverso se l’utente doveva accedere, ma un layout diverso se l’utente doveva modificare il proprio profilo.

Sto usando Rails 4.1.1

Nel controller dell’applicazione, aggiungere questo:

 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 soluzione di gran lunga più semplice è semplicemente creare un layout chiamato devise.html.haml nella cartella app / views / layouts. e la magia Rails si prende cura di tutto il resto.

 app/views/layouts/devise.html.haml 

Sorpreso di non vedere questa risposta da nessuna parte, ma puoi anche farlo:

In routes.rb, cambia la configurazione di configurazione in modo che assomigli a questa:

  devise_for :users, controllers: { sessions: 'sessions' } 

Quindi in app / controller / sessions_controller.rb

 class SessionsController < Devise::SessionsController layout 'devise', only: [:new] end 

Ciò è particolarmente utile se è necessario eseguire ulteriori sostituzioni logiche in uno qualsiasi dei controller Devise.

Solo nel caso in cui non lo sapessi, puoi anche utilizzare i rake routes per vedere i percorsi nella tua app di rotaie insieme all’azione / controller a cui mappano.

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

Ecco un one-liner per coloro che desiderano che tutte le azioni ideate utilizzino un nuovo layout:

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