sign_in 작업에 “devise”라는 다른 / 사용자 지정 레이아웃을 사용하려고합니다. 이 페이지는 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
그러나 여전히 기본 응용 프로그램 레이아웃을로드 중이므로 작동하지 않는 것 같습니다. 도움을 주시면 감사하겠습니다.
답변
액션에 커스텀 레이아웃을 적용하는 또 다른 방법은 다음과 같습니다.
How To : Create custom layouts 에 따르면 “config / environment.rb (rails 2) 또는 config / application.rb (rails 3)에서 콜백을 사용하여 특정 Devise 컨트롤러에 대한 레이아웃을 설정할 수도 있습니다. 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
ApplicationController에서 도우미를 만드는 대신 컨트롤러 / 동작을 고안하여 레이아웃을 변경하는 것이 더 낫고 내장되어 있다고 생각합니다.
답변
방금 app / views / layouts / devise / sessions.html.erb를 만들고 레이아웃을 거기에 넣었습니다.
답변
나는 그것을 알아 냈지만 다른 사람들이 궁금해 할 경우를 대비하여 여기 에이 질문을 보관할 것입니다.
어리석은 실수였습니다. 사실은 sign_in
경로이며, 하지 작업. 관련 소스를 살펴보면 필요한 조치가 new
즉, 새 Devise Session 생성 임을 알 수 있습니다 . 위 코드의 조건을 다음과 같이 변경합니다.
if devise_controller? && resource_name == :user && action_name == 'new'
아름답게 작동합니다.
누군가가 도움이되기를 바랍니다.
답변
가장 간단한 해결책은 app / views / layouts 폴더에 devise.html.haml이라는 레이아웃을 만드는 것입니다. 나머지는 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
답변
이 답변을 어디서도 볼 수 없다는 것에 놀랐지 만 다음과 같이 할 수도 있습니다.
route.rb에서 장치 구성을 다음과 같이 변경하십시오.
devise_for :users, controllers: {
sessions: 'sessions'
}
그런 다음 app / controllers / sessions_controller.rb
class SessionsController < Devise::SessionsController
layout 'devise', only: [:new]
end
이것은 Devise 컨트롤러에서 추가 로직 오버라이드를 수행해야하는 경우 특히 유용합니다.
답변
모르는 경우를 대비 rake routes
하여 레일 앱에서 해당 경로가 매핑되는 작업 / 컨트롤러와 함께 경로를 볼 수도 있습니다 .
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"}