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





controller (8)


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

我正在嘗試為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

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




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

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



我明白了,但如果其他人好奇,我會在這裡保留這個問題。

這是一個愚蠢的錯誤。 事實是sign_in是路徑, 而不是行為。 查看相關資料 ,我可以看到所需的操作是new ,即創建一個新的 Devise Session。 將我上面的代碼的條件改為:

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

精美的作品。

希望能幫助那裡的人。




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

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

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

然後在app / controllers / sessions_controller.rb中

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

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




只要你不知道,你也可以使用rake routes來查看你的rails應用中的路由以及它們映射到的action / controller。

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



目前最簡單的解決方案是在app / views / layouts文件夾中創建一個名為devise.html.haml的佈局。 而Rails的魔術則負責其餘部分。

app/views/layouts/devise.html.haml



為行動應用自定義佈局的另一種方法如下。

根據如何:創建自定義佈局 “您還可以在config / environment.rb(rails 2)或config / application.rb(rails 3)中使用回調來為特定的Devise控制器設置佈局,這需要在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 helper為特定的動作設置佈局,它的工作方式就像是魅力:

config.to_prepare do
    Devise::SessionsController.layout proc{ |controller| action_name == 'new' ? "devise"   : "application" }
end

我認為這是更好的,並建立在基於設計控制器/操作的佈局上,而不是在ApplicationController中創建幫助器。




大多數答案是部分的。 我多次遇到這個問題。 有兩件事需要解決:

<%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>

需要指定刪除方法

然後設計使用jquery,所以你需要加載這些

   <%= javascript_include_tag "myDirectiveJSfile" %> 

並確保在myDirectiveJSfile.js中指定了jQuery和jquery-ujs

//= require jquery
//= require jquery_ujs






ruby-on-rails layout devise