[ruby-on-rails] 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'

아름답게 작동합니다.

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


답변

가장 간단한 해결책은 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"}