【问题标题】:Rails - Confirmation Fields Are Tied to HTML Form HelpersRails - 确认字段绑定到 HTML 表单助手
【发布时间】:2016-03-10 17:59:41
【问题描述】:

Rails 仅在请求中有对应的 _confirmation 字段时检查字段确认。

为了进一步解释,这里是一个示例 Rails 视图:

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>

  <%= f.label :email %>
  <%= f.email_field :email, autofocus: true %>

  <%= f.label :password %>
  <%= f.password_field :password, autocomplete: "off" %>

  <%= f.label :password_confirmation %>
  <%= f.password_field :password_confirmation, autocomplete: "off" %>

  <%= f.submit "Sign up" %>

<% end %>

此表单按预期工作。

但是,如果您删除:

<%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, autocomplete: "off" %>

密码不再被确认。

我遇到的问题是我的所有JSON 请求都成功通过,但没有相应的_confirmation 字段。

此请求成功:

{
    "email": "me@example.com",
    "password" : "somepassword"
}

这不是:

{
    "email": "me@example.com",
    "password" : "somepassword",
    "password_confirmation": "_somepassword 
}

另外,对于第二个 JSON,如果 passwordpassword_confirmation 匹配,则请求成功(这是可以理解的)。

我认为第一次请求应该不会成功,因为没有密码确认。

这是错误还是预期行为,因为确认字段应绑定到 ActiveRecord 而不是来自帮助程序的 HTML。

那么如何在基于 Rails 的 JSON API 中复制字段确认?

【问题讨论】:

  • 这与表单助手无关——它只是关于允许 nil 的validates_confirmation_of 的行为。这对于 API 来说是明智的。密码确认只是帮助用户确保他按预期输入密码的一种(有点烦人的)方式。它没有实际的安全价值。

标签: ruby-on-rails ruby forms rails-activerecord password-confirmation


【解决方案1】:

我认为确认的验证在 JSON API 的上下文中是无用的。您基本上只会验证开发人员是否阅读了您的 API 描述。

因此,我认为它不验证确认密钥是否丢失是有道理的。由于表单总是会返回两个字段,因此它总是会验证用户输入。

如果您真的想强制执行确认(即使在 JSON API 上),只需关注docs

注意:仅当 password_confirmation 不是 nil 时才会执行此检查。要要求确认,请确保为确认属性添加存在检查:

validates_presence_of :password_confirmation, if: :password_changed?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 2010-12-16
    • 2014-01-26
    • 2011-04-19
    • 1970-01-01
    相关资源
    最近更新 更多