如果值为空,则触发模型上的格式验证正则表达式

时间:2016-03-30 03:39:43

标签: ruby-on-rails ruby regex validation ruby-on-rails-4

我有一个相当简单的表格。

<%= form_for([@category_item_value], url: create_category_item_value_path(key_id: item_key.id), method: :post) do |f| %>
        <%= render 'shared/error_messages', object: f.object %>
      <%= f.label :stat %> 
      <%= f.text_field :value, :value => item_key.value %>
      <%= f.hidden_field :key_type, :value => 'item-edit-request' %>
      <%= f.submit "Submit" %>

使用此模型

 validates :key, length: { maximum: 255 },
  exclusion: { in: %w( create edit new update ), message: "%{value} cant be taken." },
 format: { with: /\A[a-zA-Z0-9_-]+\z/, message: "only allows letters, numbers and '-'" }


 validates :value, length: { maximum: 65000 }

当我提交表单时,key值在数据库中保留为空或零,因为它稍后会添加。问题是我无法提交表单,因为密钥上的格式验证阻止了我的错误消息“只允许字母,数字和' - '”。

为什么会这样做,我在presence: :true上没有key验证,但由于格式验证,我不能让它变成空白。这不是一个问题,而且这种形式过去很好,直到最近我才重新审视它,并注意到表格没有提交。

为什么会这样开始发生?我该如何解决?

1 个答案:

答案 0 :(得分:2)

您只需添加allow_blank选项,否则您的正则表达式确实不匹配,格式验证将失败。有关所有验证通用的验证选项,请参阅rails guides

因此,以下内容应该有效:

validates :key, length: { maximum: 255 },
                exclusion: { in: %w( create edit new update ), message: "%{value} cant be taken." },
                format: { with: /\A[a-zA-Z0-9_-]+\z/, 
                          allow_blank: true,
                          message: "only allows letters, numbers and '-'" }

另一种可能性是将正则表达式更改为可选字符(使用*而不是+),如下所示:

 ...
 with: /\A[a-zA-Z0-9_-]*\z/ ,
 ...