在多部分表单中提交空文本字段作为空字符串,而不是空

时间:2016-04-08 14:06:02

标签: html ruby-on-rails forms multipartform-data enctype

这在我的Rails应用程序中发生,但我不确定这是否是Rails的问题,或者我是否误解了多部分表单应该如何工作。

我的表格(等等):

<%= form_for @user do |f| %>
  <%= f.text_field :name %>
  <%= f.submit %>
<% end %>

User#name有一个在线状态验证。如果我访问users/1/edit,请清空&#39;名称&#39;的值。文本字段,然后单击提交,没有任何内容更新,因为状态验证失败。到目前为止,非常好。

但是现在我已经为我的用户添加了avatar属性(使用Paperclip gem进行文件存储),所以我相应地更新了表单:

<%= form_for @user do |f| %>
  <%= f.text_field :name %>
  <%= f.file_field :avatar %>
  <%= f.submit %>
<% end %>

现在,如果我去编辑用户并为name提交空白值,则验证不会失败。 User#name保留以前的值,但更新仍然显示成功(即我没有收到有关验证失败的错误消息,并且数据库中的updated_at时间戳会更新。)

仔细观察,似乎当我在表单中包含file_field时,它会在提交空白文本字段时更改表​​单的行为(可能是由于form_for现在的事实输出带有enctype=-"multipart/form-data")的表单。

file_field 不存在时,提交空白name会将这些参数发送到服务器:

{ "id" => 1, "user" => { "name: "" }

这导致控制器中出现类似User.find(1).update_attributes(name: "")的内容,当然无法更新,因为Rails发现我们正在尝试更新名称&#39;到一个空白字符串,验证失败。

如果 存在,则会提交:

{ "id" => 1, "user" => { }(加上关于头像文件的额外信息)

&#34;名称&#34;密钥根本不存在,因此控制器运行User.find(1).update_attributes()当然,因为没有任何更新可能无法通过验证。

这是一个错误还是一个功能?为什么将enctype更改为multipart(假设问题的根源)会改变空白文本字段的行为方式? (我已经在Chrome和FF中对此进行了测试,fwiw。)如果这确实是预期的行为,我如何确保正确提交空白文本字段而不必在每个文本字段周围添加一堆繁琐的样板?

(如果重要的话,我正在使用:Ruby 2.3.0,Rails 5.0.0.beta3,Paperclip 5.0.0.beta1,我已经在Chrome 49和Firefox 45中测试过了)

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,将Rails更新到修复它的最新版本。

答案 1 :(得分:0)

我认为你可以做那样的事情

updated_user = User.new(your_params) # The new attributes is set to a new object record    
target_user = User.find(params[:id]) # the user you want to update
target_user = updated_user

    if target_user.save?
    ..
    else
    .. 

这将触发所有验证并且活动记录将具有所有新属性,如果名称为空,则它将捕获它

答案 2 :(得分:0)

以下强大的param方法不会带回drop:name参数,但它应该阻止表单模仿成功提交:

var bar = function(fn, fnParam, condition) {
  if (condition) {
    fn(fnParam);
  }
}

可以在用户控制器下将其作为私有方法插入。然后只需在Update方法中调用user_params。