簡體   English   中英

Rails/Devise:如何在 controller 中找到用戶登錄是否成功?

[英]Rails/Devise: How can I find out in the controller if the user-login was successful or not?

在視圖中,#create 和 #update 操作有這樣的習語

<% if @article.errors.any? %>
  <div id="error_explanation">
    <h2>
      <%= pluralize(article.errors.count, "error") %> prohibited
        this article from being saved:
    </h2>
    <ul>
      <% @article.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
      <% end %>
    </ul>
  </div>
<% end %>

現在,是否有類似的方法可以檢查Users::SessionsController < Devise::SessionsController ,用戶登錄是否成功?

這里有一個類似的線程Ruby on Rails Devise 代碼登錄后Peter P. Jan 18 '15 at 3:06的回答表明,正是當登錄不成功時,然后 before_action“將不會運行”,即不好,因為我需要這個信息,登錄是否不成功

附帶的代碼是

# app/controllers/custom_sessions_controller.rb
class CustomSessionsController < Devise::SessionsController
  ## for rails 5+, use before_action, after_action
  before_filter :before_login, :only => :create
  after_filter :after_login, :only => :create

  def before_login
  end

  def after_login
  end
end

但顯然對我的問題沒用......(?)

建議是使用用戶Mike Lapinskas, Oct 8 '16 at 5:33這樣的 Warden 鈎子,但內容似乎也不能解決我的問題。 是登錄的問題,不是測試登錄是否失敗

class User < ApplicationRecord
  Warden::Manager.after_set_user do |user, auth, opts|
    if (opts[:scope] == :user && opts[:event] == :set_user)
      # < Do your after login work here >
    end
  end
end

此線程Devise 中的方法:注冊失敗時重定向? 似乎很有希望

The hint to Devise::FailureApp led me to https://gist.github.com/emilsoman/5604254 , also see Custom Devise 401 unauthorized response

那里提到的響應都是 json。 這是強制性的嗎? 我不能只在html.erb -template/partial 上調用 render 嗎?

謝謝

如果要執行登錄后方法,只需創建自定義 controller,繼承Devise::SessionsController並將塊傳遞給super Devise 將在成功登錄后調用該塊。

https://github.com/heartcombo/devise/blob/57d1a1d3816901e9f2cc26e36c3ef70547a91034/app/controllers/devise/sessions_controller.rb#L22

class CustomSessionsController < Devise::SessionsController
  def create
    super do |resource|
      # do something after signing in successfully
    end 
  end
end

要處理失敗的情況,您可以捕獲由warden 的 #authenticated! 我錯了)

如果你的邏輯很復雜,你需要自定義很多代碼,只需編寫你自己的#create,不用super,並使用#create提供的方法來實現你的要求。 請記住 devise 有一些回調可能會影響您的自定義代碼。

class CustomSessionsController < Devise::SessionsController
  def create
    self.resource = warden.authenticate(auth_options) # Without `!`
    if resource
      # success
    else
      # failure
    end
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM