web-dev-qa-db-ja.com

deviseのsign_inアクションの異なるレイアウト

Sign_inアクションに「devise」という名前の異なる/カスタムレイアウトを使用しようとしています。 dev-wikiで this ページを見つけました。2番目の例では、アクションごとに実行できると書かれています(この場合、sign_in action)、しかし、それを行う例は示していません。 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

しかし、デフォルトのアプリケーションレイアウトをロードしているため、機能していないようです。助けていただければ幸いです。

80

私はそれを理解しましたが、他の人が好奇心を抱く場合に備えて、ここでこの質問を続けます。

それは愚かな間違いでした。事実はsign_inはパス、notアクションです。 関連するソース を見ると、必要なアクションはnewであることがわかります。つまり、newセッションを考案します。上記のコードの条件を次のように変更します。

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

美しく機能します。

それがそこに誰かを助けることを願っています。

44

アクションにカスタムレイアウトを適用する別の方法は、次のとおりです。

How To:Create custom layouts "config/environment.rb(Rails 2)またはconfig/application.rb(Rails 3)のコールバックを使用して、特定のDeviseコントローラーのレイアウトを設定することもできます。これは本番環境で1回実行され、開発中の各要求の前に実行されるため、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でヘルパーを作成するのではなく、工夫したコントローラー/アクションに基づいてレイアウトを変更するためのより良い方法で構築されていると思います。

92
Zeeshan

App/views/layouts/devise/sessions.html.erbを作成し、そこにレイアウトを配置しました。

61
Josh

これが私がやった方法です。ユーザーがサインインする必要がある場合は別のレイアウトが必要でしたが、ユーザーがプロファイルを編集する必要がある場合は別のレイアウトが必要でした。

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
8
Sankalp Singha

最も単純なソリューションは、app/views/layoutsフォルダーにdevise.html.hamlというレイアウトを作成することです。そして、Rails magicが残りを処理します。

app/views/layouts/devise.html.haml
8
John

この答えがどこにも表示されないことに驚いたが、これを行うこともできます:

Routes.rbで、devise configを次のように変更します。

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

次に、app/controllers/sessions_controller.rb

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

これは、いずれかのDeviseコントローラーで追加のロジックオーバーライドを行う必要がある場合に特に便利です。

7
streetlogics

知らなかった場合に備えて、rake routesを使用して、Railsアプリ内のルートと、それらがマップするアクション/コントローラーを表示することもできます。

 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"}
1
Dty

すべての工夫アクションで新しいレイアウトを使用したい人のためのワンライナーです:

class ApplicationController < ActionController::Base
  protect_from_forgery

  layout Proc.new { |controller| controller.devise_controller? ? 'devise' : 'application' }
end
0
vlad