devise의 sign_in 작업에 대한 다른 레이아웃
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'
아름답게 작동합니다.
누군가가 도움이되기를 바랍니다.
이것이 내가 한 방법입니다. 사용자가 로그인해야하는 경우 다른 레이아웃을 원했지만 사용자가 자신의 프로필을 편집해야하는 경우 다른 레이아웃을 원했습니다.
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
The by far simplest solution is to just create a layout called devise.html.haml in your app/views/layouts folder. and the Rails magic takes care of the rest.
app/views/layouts/devise.html.haml
Surprised to not see this answer anywhere, but you can also do this:
In routes.rb, change your devise config to look something like this:
devise_for :users, controllers: {
sessions: 'sessions'
}
Then in app/controllers/sessions_controller.rb
class SessionsController < Devise::SessionsController
layout 'devise', only: [:new]
end
This is especially useful if you need to do additional logic overrides in any of the Devise controllers.
Just incase you didn't know, you can also use rake routes
to see the routes in your rails app along with the action/controller they map to.
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"}
Here's a one-liner for those who want all devise actions to use a new layout:
class ApplicationController < ActionController::Base
protect_from_forgery
layout Proc.new { |controller| controller.devise_controller? ? 'devise' : 'application' }
end
참고URL : https://stackoverflow.com/questions/4982073/different-layout-for-sign-in-action-in-devise
'Program Tip' 카테고리의 다른 글
awk substr을 사용하여 마지막 필드 가져 오기 (0) | 2020.10.06 |
---|---|
JSON의 유효성을 검사하는 정규식 (0) | 2020.10.06 |
C #에서 ping 사용 (0) | 2020.10.06 |
HighCharts-포인트를 끄려면 어떻게해야합니까? (0) | 2020.10.06 |
java.lang.ClassNotFoundException : com.sun.jersey.spi.container.servlet.ServletContainer (0) | 2020.10.06 |