Próbuję użyć innego / niestandardowego układu o nazwie „devise” dla akcji sign_in. Znalazłem tę stronę na wiki devise, a drugi przykład mówi nawet, że możesz to zrobić za pomocą akcji (w tym przypadku sign_in
akcji), ale nie pokazuje tego przykładu. Ktoś na IRC powiedział mi, że mogę spróbować:
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
Ale wygląda na to, że nie działa, ponieważ nadal ładuje domyślny układ aplikacji. Byłbym wdzięczny za każdą pomoc.
źródło
Właśnie utworzyłem app / views / layouts / devise / session.html.erb i umieściłem tam mój układ.
źródło
Rozgryzłem to, ale zatrzymam to pytanie na wypadek, gdyby inni byli ciekawi.
To był głupi błąd. Faktem jest, że
sign_in
chodzi o ścieżkę, a nie działanie. Patrząc na odpowiednie źródło , widzę, że wymaganym działaniem jestnew
np. Utworzenie nowej sesji Devise. Zmiana warunku powyższego kodu na:if devise_controller? && resource_name == :user && action_name == 'new'
Działa pięknie.
Mam nadzieję, że to pomoże komuś tam.
źródło
Zdecydowanie najprostszym rozwiązaniem jest po prostu utworzenie układu o nazwie devise.html.haml w folderze app / views / layouts. a magia Railsów zajmie się resztą.
źródło
Tak to zrobiłem. Chciałem mieć inny układ, jeśli użytkownik musiałby się zalogować, ale inny układ, jeśli użytkownik musiałby edytować swój profil.
Używam Rails 4.1.1
W kontrolerze aplikacji dodaj to:
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
źródło
Zaskoczony, że nigdzie nie widzę tej odpowiedzi, ale możesz też zrobić to:
W route.rb zmień konfigurację urządzenia, aby wyglądała mniej więcej tak:
devise_for :users, controllers: { sessions: 'sessions' }
Następnie w pliku app / controllers / session_controller.rb
class SessionsController < Devise::SessionsController layout 'devise', only: [:new] end
Jest to szczególnie przydatne, jeśli musisz wykonać dodatkowe nadpisania logiki w którymkolwiek z kontrolerów Devise.
źródło
Na wypadek, gdybyś nie wiedział, możesz również użyć
rake routes
do wyświetlenia tras w aplikacji rails wraz z akcją / kontrolerem, na który mapują.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"}
źródło
Oto jedna linijka dla tych, którzy chcą, aby wszystkie działania korzystały z nowego układu:
class ApplicationController < ActionController::Base protect_from_forgery layout Proc.new { |controller| controller.devise_controller? ? 'devise' : 'application' } end
źródło