복붙노트

[RUBY-ON-RAILS] 유증에 sign_in 행동에 대한 다른 레이아웃

RUBY-ON-RAILS

유증에 sign_in 행동에 대한 다른 레이아웃

나는 sign_in의 조치에 대해 "유증"라는 이름의 다른 / 사용자 정의 레이아웃을 사용하려고 해요. 나는 유증 위키에서이 페이지를 발견하고, 두 번째 예는 심지어 당신이 (행동 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

하지만 여전히 기본 응용 프로그램 레이아웃을로드 할 것으로 작동하지 않는 것 같습니다. 난 어떤 도움을 주셔서 감사합니다.

해결법

  1. ==============================

    1.작업에 대한 사용자 지정 레이아웃을 적용하는 또 다른 방법은 다음과 같다.

    작업에 대한 사용자 지정 레이아웃을 적용하는 또 다른 방법은 다음과 같다.

    사용법에 따르면 사용자 정의 레이아웃 만들기 "또한 콜백에서 설정 / environment.rb에 (2 레일) 또는 설정 / application.rb (3 레일)이 필요가에서 수행 할 사용하여 특정 유증 컨트롤러의 레이아웃을 설정할 수 있습니다. 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에 도우미를 만드는 유증 컨트롤러 / 액션을 기반으로 레이아웃을 변경하는 방법에 지어 생각한다.

  2. ==============================

    2.난 그냥 응용 프로그램 / 뷰 / 레이아웃 / 궁리 / sessions.html.erb을 만들고 거기에 내 레이아웃을 넣어.

    난 그냥 응용 프로그램 / 뷰 / 레이아웃 / 궁리 / sessions.html.erb을 만들고 거기에 내 레이아웃을 넣어.

  3. ==============================

    3.나는 그것을 알아 냈하지만 다른 사람들이 호기심이 경우 여기에이 질문을하겠습니다.

    나는 그것을 알아 냈하지만 다른 사람들이 호기심이 경우 여기에이 질문을하겠습니다.

    그것은 바보 같은 실수였다. 경로가 아닌 작업입니다 sign_in 사실이다. 관련 소스를 보면, 나는 새로운 고안 세션을 생성, 즉, 필요한 조치가 새로운 것을 볼 수 있습니다. 내 위의 코드를 변경하면 조건부하기입니다 :

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

    아름답게 작동합니다.

    이 사람을 도움이되기를 바랍니다.

  4. ==============================

    4.이것은 내가 그것을 한 방법이다. 사용자가 로그인해야한다면 나는 다른 레이아웃을 원하지만, 사용자가 편집 할 수있는 그 / 그녀의 프로필을 다른 레이아웃이 있다면.

    이것은 내가 그것을 한 방법이다. 사용자가 로그인해야한다면 나는 다른 레이아웃을 원하지만, 사용자가 편집 할 수있는 그 / 그녀의 프로필을 다른 레이아웃이 있다면.

    나는 레일 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
    
  5. ==============================

    5.에 의해 지금까지 가장 간단한 해결책은 당신의 app / views / layouts 폴더에 devise.html.haml라는 레이아웃을 만드는 것입니다. 그리고 레일 마법 나머지 처리합니다.

    에 의해 지금까지 가장 간단한 해결책은 당신의 app / views / layouts 폴더에 devise.html.haml라는 레이아웃을 만드는 것입니다. 그리고 레일 마법 나머지 처리합니다.

    app/views/layouts/devise.html.haml
    
  6. ==============================

    6.하지에 놀란 것은이 응답 어디서나 볼 수 있지만, 당신은 또한이 작업을 수행 할 수 있습니다

    하지에 놀란 것은이 응답 어디서나 볼 수 있지만, 당신은 또한이 작업을 수행 할 수 있습니다

    routes.rb에서이 같이 뭔가에 유증의 설정을 변경 :

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

    그런 다음 응용 프로그램 / 컨트롤러 / sessions_controller.rb에서

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

    당신이 고안 컨트롤러의 추가적인 논리 오버라이드 (override) 할 필요가있는 경우에 특히 유용합니다.

  7. ==============================

    7.그냥 당신이 모르는 경우에, 당신은 또한 그들이에 매핑 작업 / 컨트롤러와 함께 당신의 레일 응용 프로그램의 경로를 볼 레이크 경로를 사용할 수 있습니다.

    그냥 당신이 모르는 경우에, 당신은 또한 그들이에 매핑 작업 / 컨트롤러와 함께 당신의 레일 응용 프로그램의 경로를 볼 레이크 경로를 사용할 수 있습니다.

     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"}
    
  8. ==============================

    8.여기에 모든 유증 작업이 새로운 레이아웃을 사용하고자하는 사람들을위한 한 줄입니다 :

    여기에 모든 유증 작업이 새로운 레이아웃을 사용하고자하는 사람들을위한 한 줄입니다 :

    class ApplicationController < ActionController::Base
      protect_from_forgery
    
      layout Proc.new { |controller| controller.devise_controller? ? 'devise' : 'application' }
    end
    
  9. from https://stackoverflow.com/questions/4982073/different-layout-for-sign-in-action-in-devise by cc-by-sa and MIT license