Я пытаюсь использовать другой / настраиваемый макет с именем "devise" для действия sign_in. Я нашел эту страницу в devise wiki, и во втором примере даже говорится, что вы можете делать это для каждого действия (в данном случае, sign_in
действия), но он не показывает примера этого. Кто-то из 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
Но, похоже, он не работает, поскольку все еще загружает макет приложения по умолчанию. Буду признателен за любую помощь.
источник
Я только что создал app / views / layouts / devise / sessions.html.erb и поместил туда свой макет.
источник
Я разобрался, но оставлю этот вопрос здесь на случай, если другим будет интересно.
Это была глупая ошибка. Дело в том,
sign_in
что путь, а не действие. Глядя на соответствующий источник , я вижу, что требуется действиеnew
, т. Е. Создание нового сеанса разработки. Изменение моего условного кода выше на:if devise_controller? && resource_name == :user && action_name == 'new'
Красиво работает.
Надеюсь, это поможет кому-то там.
источник
Самым простым решением является создание макета с именем devise.html.haml в папке app / views / layouts. а об остальном позаботится магия Rails.
app/views/layouts/devise.html.haml
источник
Вот как я это сделал. Мне нужен был другой макет, если пользователю нужно было войти в систему, и другой макет, если пользователю нужно было редактировать свой профиль.
Я использую Rails 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
источник
Удивлен, что нигде не вижу этого ответа, но вы также можете сделать это:
В routes.rb измените конфигурацию вашего устройства, чтобы он выглядел примерно так:
devise_for :users, controllers: { sessions: 'sessions' }
Затем в app / controllers / sessions_controller.rb
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"}
источник
Вот однострочник для тех, кто хочет, чтобы все действия при разработке использовали новый макет:
class ApplicationController < ActionController::Base protect_from_forgery layout Proc.new { |controller| controller.devise_controller? ? 'devise' : 'application' } end
источник