другой макет для входа в действие в devise
Я пытаюсь использовать другой / пользовательский макет с именем "devise" для действия sign_in. Я нашел этой страница в devise wiki, и второй пример даже говорит, что вы можете сделать это за действие (в этом случае, sign_in
action), но он не показывает примера этого. Кто-то на IRC сказал мне, что я могу попробовать это:
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
но он, похоже, не работает, поскольку он все еще загружает макет приложения по умолчанию. Я был бы признателен за любую помощь.
8 ответов:
другой способ применить пользовательский макет для действия заключается в следующем.
По данным как создать пользовательские макеты " вы также можете установить макет для конкретных контроллеров Devise с помощью обратного вызова в config/environment.rb (rails 2) или config/application.РБ (рельсы 3). Это должно быть сделано в обратном вызове to_prepare, потому что он выполняется один раз в производстве и перед каждым запросом в разработке."
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
обычно делается различие макета между страницами за логином и страницами, которые не требуют аутентификации, поэтому вышеуказанный подход работает большую часть времени. Но я также экспериментировал с использованием
action_name
помощник, чтобы установить макет для конкретного действия, и он работал как шарм:config.to_prepare do Devise::SessionsController.layout proc{ |controller| action_name == 'new' ? "devise" : "application" } end
Я думаю, что это лучший и встроенный способ изменить макет на основе devise controller/action вместо создания помощника в ApplicationController.
Я только что создал приложение/views/layouts/devise / sessions.формат html.Эрб и положить мой макет там.
я понял это, но я буду держать этот вопрос здесь, если другие люди любопытны.
Это была глупая ошибка. Дело в том,
sign_in
путь, не действие. Глядя на соответствующий источник, Я вижу, что требуемое действиеnew
, т. е. создание новая Разработать Сессии. Изменение моего кода выше условно:if devise_controller? && resource_name == :user && action_name == 'new'
прекрасно работает.
надеюсь, что это поможет кому-то там.
вот как я это сделал. Я хотел другой макет, если пользователь должен был войти в систему, но другой макет, если пользователь должен был редактировать свой профиль.
Я использую рельсы 4.1.1
в контроллере приложения добавьте следующее:
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
самое простое решение-просто создать макет под названием devise.формат html.haml в папке приложения / представления / макеты. а об остальном заботится магия рельсов.
app/views/layouts/devise.html.haml
удивлен, что не вижу этого ответа нигде, но вы также можете сделать это:
в маршрутах.rb, измените конфигурацию devise, чтобы выглядеть примерно так:
devise_for :users, controllers: { sessions: 'sessions' }
затем в app / controllers / sessions_controller.РБ
class SessionsController < Devise::SessionsController layout 'devise', only: [:new] end
это особенно полезно, если вам нужно сделать дополнительные логические переопределения в любом из контроллеров Devise.
просто упакуйте вы не знали, вы также можете использовать
rake routes
чтобы увидеть маршруты в вашем приложении rails вместе с действием / контроллером, к которому они привязаны.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"}