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
しかし、デフォルトのアプリケーションレイアウトをロードしているため、機能していないようです。助けていただければ幸いです。
私はそれを理解しましたが、他の人が好奇心を抱く場合に備えて、ここでこの質問を続けます。
それは愚かな間違いでした。事実はsign_in
はパス、notアクションです。 関連するソース を見ると、必要なアクションはnew
であることがわかります。つまり、newセッションを考案します。上記のコードの条件を次のように変更します。
if devise_controller? && resource_name == :user && action_name == 'new'
美しく機能します。
それがそこに誰かを助けることを願っています。
アクションにカスタムレイアウトを適用する別の方法は、次のとおりです。
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でヘルパーを作成するのではなく、工夫したコントローラー/アクションに基づいてレイアウトを変更するためのより良い方法で構築されていると思います。
App/views/layouts/devise/sessions.html.erbを作成し、そこにレイアウトを配置しました。
これが私がやった方法です。ユーザーがサインインする必要がある場合は別のレイアウトが必要でしたが、ユーザーがプロファイルを編集する必要がある場合は別のレイアウトが必要でした。
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
最も単純なソリューションは、app/views/layoutsフォルダーにdevise.html.hamlというレイアウトを作成することです。そして、Rails magicが残りを処理します。
app/views/layouts/devise.html.haml
この答えがどこにも表示されないことに驚いたが、これを行うこともできます:
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コントローラーで追加のロジックオーバーライドを行う必要がある場合に特に便利です。
知らなかった場合に備えて、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"}
すべての工夫アクションで新しいレイアウトを使用したい人のためのワンライナーです:
class ApplicationController < ActionController::Base
protect_from_forgery
layout Proc.new { |controller| controller.devise_controller? ? 'devise' : 'application' }
end