81 votes

mise en page différente pour sign_in action en concevoir

Je suis en train d'utiliser un autre/mise en page personnalisée nommée "concevoir" pour le sign_in action. J'ai trouvé cette page dans le dispositif wiki, et le deuxième exemple, on dit même que vous pouvez le faire par l'action (dans ce cas, sign_in d'action), mais il ne montre aucun exemple de le faire. Quelqu'un sur IRC m'a dit que je pourrais 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 il ne semble pas fonctionner comme il est toujours en train de charger l'application par défaut de mise en page. Je vous serais reconnaissant de toute aide.

95voto

Zeeshan Points 2159

Une autre manière d'appliquer une mise en page personnalisée d'une action de la manière suivante.

Selon Comment: Créer des mises en page ", Vous pouvez aussi définir la mise en page spécifique de Concevoir des contrôleurs à l'aide d'un rappel dans config/environment.rb (2 rails) ou config/application.rb (rails 3). Ce qui doit être fait dans un to_prepare de rappel parce que c'est exécutée une fois dans la production et avant chaque demande dans le 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

Habituellement, une disposition, une distinction est faite entre les pages derrière de connexion et des pages qui ne nécessitent pas d'authentification, de sorte que l'approche ci-dessus fonctionne la plupart du temps. Mais j'ai aussi expérimenté avec l'aide d' action_name de l'aide pour définir une mise en page pour une action particulière et cela a fonctionné 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 et construit de manière à modifier la mise en page basée sur concevoir contrôleur/action au lieu de créer un helper dans ApplicationController.

63voto

Josh Points 369

Je viens de créer app/views/layouts/concevoir/sessions.html.erb et de mettre à ma disposition.

44voto

Jorge Israel Peña Points 12602

J'ai tout compris, mais je vais garder cette question ici au cas où d'autres personnes sont curieux.

C'était une erreur stupide. Le fait est - sign_in est le chemin, pas l'action. En regardant la source, je peux voir que l'action requise est - new, c'est à dire, la création d'une nouvelle de Concevoir la Session. Modification de mon code ci-dessus est subordonnée à:

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

Fonctionne à merveille.

Espère que ça aide quelqu'un là-bas.

8voto

Sankalp Singha Points 1154

Voilà comment j'ai fait. Je voulais une mise en page différente si l'utilisateur a dû signer, mais une mise en page différente si l'utilisateur a dû modifier son profil.

Je suis à l'aide de Rails 4.1.1

Dans le contrôleur de l'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

1voto

Dty Points 7756

Juste au cas où vous ne le saviez pas, vous pouvez également utiliser rake routes voir les routes de votre application rails avec de l'action/du contrôleur de la carte.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X