[ruby-on-rails] 設計中的sign_in動作的不同佈局


Answers

我剛剛創建了app / views / layouts / devise / sessions.html.erb並將我的佈局放在那裡。

Question

我正在嘗試為sign_in操作使用名為“設計”的不同/自定義佈局。 我在設計維基中找到了this頁面,第二個例子甚至說你可以按照每個動作(在這個例子中是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

但它似乎沒有工作,因為它仍在加載默認的應用程序佈局。 我將不勝感激任何幫助。




驚訝於任何地方都看不到這個答案,但你也可以這樣做:

在routes.rb中,將您的設備配置更改為如下所示:

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

然後在app / controllers / sessions_controller.rb中

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

如果您需要在任何Devise控制器中執行額外的邏輯覆蓋,這一點尤其有用。




這是我做到的。 如果用戶必須登錄,我想要一個不同的佈局,但如果用戶必須編輯他/她的個人資料,則需要不同的佈局。

我正在使用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



對於那些希望所有設計操作使用新佈局的人來說,這是一個單行的內容:

class ApplicationController < ActionController::Base
  protect_from_forgery

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



Links