如何获得登录表单的设计错误?

How can I get devise errors for a sign in form?

我先说我已经阅读了重复的问题。他们好像年纪大了,解决办法也没用。

我在 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 %>

我在网上尝试了其他几个变体,但似乎没有发现任何错误。如果我输入了错误的电子邮件密码组合,则什么也不会发生。我在其他形式(如创建或编辑模型)中使用了相同的语法,并且工作正常。

不知道为什么它与设计登录不同。

如何在设计表单中获取错误?

你的期望是错误的。

Devise 中身份验证工作原理的 speedrun 解释是 Devise::SessionsController#create 调用 self.resource = warden.authenticate!(auth_options),如果 Warden 找不到具有给定 email/password 的用户,它将 throw(:warden)。然后通过调用 Devise::FailureApp 将用户重定向到登录路径来捕获抛出。

这是一个比普通脚手架 Rails 控制器更复杂的操作,它只在验证失败时呈现新视图。

resource 对象没有错误,因为:

  • resource 您表单中的实例与在完全不同的请求周期中执行身份验证时的实例不同。
  • 首先没有添加错误,因为这不是简单验证失败的情况。也不应该有。

你不会需要它。

当 Devise 执行验证失败时,它只是设置一个默认为 "Invalid email or password." 的闪现消息。请记住,Flash 消息是通过 cookie 从一个请求传递到下一个请求的 - 模型实例不是。

这也是您实际应该提供的唯一反馈。例如,如果您添加了一个单独的“无效电子邮件”消息,它会让攻击者执行暴力攻击来确定电子邮件是否存在,而您只是让他们的工作变得容易得多。

您可以简单地通过 defining your own locale file 自定义即显消息,如果您愿意,您可以在表单上显示即显消息。