devise의 sign_in 작업에 대한 다른 레이아웃


84

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

그러나 여전히 기본 응용 프로그램 레이아웃을로드 중이므로 작동하지 않는 것 같습니다. 도움을 주시면 감사하겠습니다.

답변:


96

액션에 커스텀 레이아웃을 적용하는 또 다른 방법은 다음과 같습니다.

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에서 도우미를 만드는 대신 컨트롤러 / 동작을 고안하여 레이아웃을 변경하는 것이 더 낫고 내장되어 있다고 생각합니다.


3
또한 config 폴더의 파일을 변경할 때마다 서버를 다시 시작하는 것을 잊지 마십시오 (이 경우 Rails3의 경우 config / application.rb, Rails 2의 경우 config / environment.rb).
Zeeshan

조심 나는 레일 3.1에서이 방법을 시도하고 자산이 상당히 느린 폴더에서 자산의 로딩을합니다. 이것은 프로덕션 서버에 영향을 미치지 않지만 css / js 파일이 몇 개 이상있는 경우이를 알 수 있습니다.
Gazler 2012

위의 예에서 별도의 유증 자원 (예를 들어,의 우리가 고안 사용자의 두 가지 유형이 각각 자신의 레이아웃을 필요 척하자)에 대한 구성 레이아웃에 가능하다
ckarbass

이것을 시도하면 두 위치에서 템플릿을 가져 오려고한다는 오류가 발생합니다. Rails가 Devise의 이전 설정을 재정의하도록하려면 어떻게해야합니까?
애덤 그랜트

그것을 놓친 사람들을 위해-Rails 3 설정은 다릅니다-config / application.rb (rails 3)에서 이것을하십시오.
스톤

66

방금 app / views / layouts / devise / sessions.html.erb를 만들고 레이아웃을 거기에 넣었습니다.


28
훌륭한 솔루션! 레이아웃을 /app/views/layouts/devise.html.erb에 넣고 모든 장치 보기에 적용 할 수도 있습니다
Basti

45

나는 그것을 알아 냈지만 다른 사람들이 궁금해 할 경우를 대비하여 여기 에이 질문을 보관할 것입니다.

어리석은 실수였습니다. 사실은 sign_in경로이며, 하지 작업. 관련 소스를 살펴보면 필요한 조치가 new즉, Devise Session 생성 임을 알 수 있습니다 . 위 코드의 조건을 다음과 같이 변경합니다.

if devise_controller? && resource_name == :user && action_name == 'new'

아름답게 작동합니다.

누군가가 도움이되기를 바랍니다.


이것은 registrations # new 및 sessions # new 모두에 대한 레이아웃을 적용하지 않습니까?
Ayrad

12

가장 간단한 해결책은 app / views / layouts 폴더에 devise.html.haml이라는 레이아웃을 만드는 것입니다. 나머지는 Rails 매직이 처리합니다.

app/views/layouts/devise.html.haml

3
이것은 고안을위한 레이아웃을 설정하는 가장 간단한 방법입니다. 고마워!
phlegx

8

이것이 내가 한 방법입니다. 사용자가 로그인해야하는 경우 다른 레이아웃을 원했지만 사용자가 자신의 프로필을 편집해야하는 경우 다른 레이아웃을 원했습니다.

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

7

이 답변을 어디서도 볼 수 없다는 것에 놀랐지 만 다음과 같이 할 수도 있습니다.

route.rb에서 장치 구성을 다음과 같이 변경하십시오.

  devise_for :users, controllers: {
    sessions: 'sessions'
  }

그런 다음 app / controllers / sessions_controller.rb

class SessionsController < Devise::SessionsController
  layout 'devise', only: [:new]
end

이것은 Devise 컨트롤러에서 추가 로직 오버라이드를 수행해야하는 경우 특히 유용합니다.


2
이것이 바로 내가 찾고 있던 것입니다! / : 다른 사람의 아무도는 어떤 이유로 일하지
djGrill

1

모르는 경우를 대비 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"}

고마워요, 저는 레이크 루트에 대해 실제로 알고 / 알았습니다 .'sign_in '이 실제 액션의 이름이 아닐 수도 있다는 생각을 잠시하지 않았고, 그럴 것이라고 생각했고, 모든 것이 세션을 중심으로 진행된다는 것을 깨달았습니다. 이것이 새로운 행동에 해당하는 이유입니다.
Jorge Israel Peña

0

새로운 레이아웃을 사용하기 위해 모든 고안 작업을 원하는 사람들을위한 한 줄짜리가 있습니다.

class ApplicationController < ActionController::Base
  protect_from_forgery

  layout Proc.new { |controller| controller.devise_controller? ? 'devise' : 'application' }
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.