我會先說我已經閱讀了重復的問題。他們似乎很老了,他們的解決方案沒有奏效。
我有以下代碼用于自定義登錄表單views/devise/sessions/new.html.erb:
<%= form_with model: resource, url: session_path(resource_name), as: resource_name do |form| %>
<%= form.text_field :email, class: "input" %>
<%= form.password_field :password, class: "input" %>
<%= tag.button(class: "btn-gradient input-button", type: "submit") do %>
<span>Sign In</span>
<% end %>
<% end %>
我正在嘗試提取錯誤并顯示它們,但以下內容不起作用:
<% if resource.errors.any? %>
<div class="error">
<% resource.errors.full_messages.each do |message| %>
- <%= message %></br>
<% end %>
</div>
<% end %>
我在網上嘗試了其他一些變體,但似乎沒有發現任何錯誤。如果我輸入了錯誤的電子郵件密碼組合,則不會發生任何事情。我在其他形式(例如創建或編輯模型)中使用了相同的語法,并且效果很好。
不知道為什么它與設計登錄不同。
如何在設計表單中出現錯誤?
uj5u.com熱心網友回復:
你的期望是錯誤的。
對 Devise 中身份驗證如何作業的快速運行解釋是Devise::SessionsController#create呼叫self.resource = warden.authenticate!(auth_options),如果 Warden 找不到具有給定電子郵件/密碼的用戶,它將拋出 (:warden)。然后通過呼叫Devise::FailureApp將用戶重定向到登錄路徑來捕獲拋出。
如果您還沒有收集它,那么這是一個更復雜的操作,然后您的普通腳手架 Rails 控制器只會在驗證失敗時呈現新視圖。
物件上沒有錯誤,resource因為:
resource在您的表單中與在完全不同的請求周期中執行身份驗證時的實體不同。- 首先沒有添加任何錯誤,因為這不是簡單驗證失敗的情況。也不應該有。
你不需要它。
當 Devise 執行驗證失敗時,它只會設定一條默認為"Invalid email or password.". 請記住,Flash 訊息通過 cookie 從一個請求傳遞到下一個請求 - 模型實體不是。
這也是您實際應該給出的唯一反饋。例如,如果您添加了一個單獨的“無效電子郵件”訊息,它可以讓執行暴力攻擊的攻擊者確定電子郵件是否存在,而您只是讓他們的作業變得更加容易。
您可以通過定義自己的語言環境檔案來自定義 Flash 訊息,如果您愿意,您可以在表單上顯示 Flash 訊息。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/443720.html
