少於 1 分鐘閱讀

有三種方式

  1. 在 DeviseController 定義layout
  2. 在 ApplicationController 定義layout
  3. 在 config (config/application.rb) 定義layout (推薦此種)

第一種

需要自己寫一個User::RegistrationsController來override

class User::RegistrationsController < Devise::RegistrationsController
  layout 'dashboard', only: [:edit]

  def edit
    super
  end
end

第二種

用判斷的方式處理

class ApplicationController < ActionController::Base
  layout :layout_by_resource

  protected

  def layout_by_resource
    if devise_controller?
      "layout_name_for_devise"
    else
      "application"
    end
  end
end

第三種 (個人認為這種最方便使用)

這段要放在end之後,其實原本應該放application.rb,這邊是為了把devise統一放在一起

## [path] config/initializers/devise.rb
Rails.application.config.to_prepare do
  Devise::SessionsController.layout proc { |controller| user_signed_in? ? "admin" : "application" }
  Devise::RegistrationsController.layout proc { |controller| user_signed_in? ? "admin" : "application" }
  Devise::ConfirmationsController.layout "admin"
  Devise::UnlocksController.layout "admin"
  Devise::PasswordsController.layout "admin"
end

參考

  1. https://github.com/plataformatec/devise/wiki/How-To:-Create-custom-layouts

更新時間:

留言