Rails - 确认字段与HTML表单助手绑定

时间:2016-03-10 17:59:41

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

如果请求中有相应的_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中复制字段确认呢?

1 个答案:

答案 0 :(得分:1)

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

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

如果您真的想要强制执行确认(即使是在JSON API上),请按照docs

进行操作
  

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

     

validates_presence_of :password_confirmation, if: :password_changed?