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


84

sign_inアクションに「devise」という名前の別の/カスタムレイアウトを使用しようとしています。このページはdevisewikiで見つけました。2番目の例では、アクション(この場合は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

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

ハウツーによると:カスタムレイアウトを作成する"config / environment.rb(rails 2)またはconfig / application.rb(rails 3)のコールバックを使用して、特定のDeviseコントローラーのレイアウトを設定することもできます。これは、で行う必要があります。 to_prepareコールバックは、本番環境で1回実行され、開発中の各リクエストの前に実行されるためです。」

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、Rails2の場合はconfig / environment.rb)に変更を加えるたびにサーバーを再起動して、変更を有効にすることを忘れないでください。
Zeeshan 2011

Rails 3.1でこの方法を試したところ、assetsフォルダーからのアセットの読み込みが大幅に遅くなることに注意してください。これは本番サーバーには影響しませんが、css / jsファイルが数個以上ある場合は気付くでしょう。
ガズラー2012

上記の例では、個別のデバイスリソースのレイアウトを構成できますか(たとえば、2つの異なるタイプの
デバイスユーザーがいて

これを試してみると、2つの場所からテンプレートを取得しようとしているというエラーが表示されます。RailsにDeviseの以前の設定を上書きするにはどうすればよいですか?
アダムグラント

それを見逃した人のために-Rails3のセットアップは異なります-config / application.rb(rails 3)でこれを行います。
ストーン

66

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


28
素晴らしい解決策!また/app/views/layouts/devise.html.erbにレイアウトを置くことができ、それがに適用されているすべてのあなたの工夫ビュー
バスティ

45

私はそれを理解しましたが、他の人が興味を持っている場合に備えて、この質問をここに残しておきます。

それはばかげた間違いでした。事実は、行動sign_inはなく、道です。見ると、関連するソース、私は必要なアクションがあることがわかりますnew作成、すなわち、新しい工夫セッション。上記のコードの条件を次のように変更します。

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

美しく動作します。

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


これは、registrations#newとsessions#newの両方のレイアウトに適用されませんか?
Ayrad 2017

12

はるかに簡単な解決策は、app / views / layoutsフォルダーにdevise.html.hamlというレイアウトを作成することです。Railsの魔法が残りを処理します。

app/views/layouts/devise.html.haml

3
これは、デバイスのレイアウトを設定するための非常に簡単な方法です。どうも!
phlegx 2016年

8

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

Rails4.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

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

ルート.rbで、デバイス構成を次のように変更します。

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

次に、app / controllers /sessions_controller.rbで

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

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


2
これはまさに私が探していたものです!他のどれも何らかの理由で機能しませんでした:/
djGrill 2015

1

知らなかった場合に備えて、rake routesRailsアプリでルートをマップするアクション/コントローラーと一緒に表示することもできます。

 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」が実際のアクションの名前ではないかもしれないと一瞬考えていませんでした、私はそれがそうなると思いました、そしてそれはすべてセッションを中心に展開していることに気づきましたそれが新しいアクションに対応する理由です。
ホルヘイスラエルペーニャ

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.