1

_confirmation如果请求中有相应的字段,Rails 只会检查字段确认。

为了进一步解释,这里是一个示例 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 中复制字段确认呢?

4

1 回答 1

1

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

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

如果您真的想强制执行确认(即使在 JSON API 上),只需遵循文档

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

validates_presence_of :password_confirmation, if: :password_changed?

于 2016-03-10T18:08:44.007 回答