Rails 5:如何为ActiveModel实现条件验证?

时间:2017-01-31 16:24:53

标签: ruby-on-rails validation

如下面的代码所示,我试图根据相同表单的复选框的值验证ActiveModel对象的表单值。 如果选中此框(我确保它将返回true而不是1),则应停用order_number上的验证,因为该字段也已停用(通过JS)。下面显示的天真方法,使用连接到复选框not_a_customer的属性作为验证order_number的条件不起作用。

我还能尝试什么?

我有一个ActiveModel类:

class SupportCase
  include ActiveModel::Model
  include ActiveModel::Validations

  attr_accessor(:email, :os, :inquiry_type, :order_number, :first_name, :last_name, :message, :not_a_customer)

  validates :order_number, presence: true,
                           numericality: { only_integer: true },
                           length: { in: (4..5), message: 'doh' },
                           unless: :not_a_customer
end

用于创建支持案例的表单:

= simple_form_for @support_case, html: { class: 'form inset' } do |f|
  .row
    .col.sm-6
      .row{ id: 'order-row' }
        .col.sm-6
          = f.input :order_number, input_html: { class: 'icon-field hash-icon' }
        .col.sm-6
          .label-title{ title: t("simple_form.labels.support_case.hint") }
            = f.input :not_a_customer, as: :boolean do
              = f.check_box :not_a_customer, {}, "true", "false"

    .col.sm-6
      = f.input :email, input_html: { type: 'email', required: 'true' }
      = f.input :first_name, input_html: { type: 'text' }
      = f.input :last_name, input_html: { type: 'text' }

    .col.sm-12
      ~ f.input :message, as: 'text', input_html: { required: 'true' }

    %button.btn.btn-action
      = t('views.contact.form.submit')

1 个答案:

答案 0 :(得分:1)

检查not_a_customer的值。你只是得到一个字符串而不是一个布尔值,这总是真实的(“真”,“假”都是真值)。

在Rails中,您可以not_a_customer.to_bool将其转换为布尔值。

checkbox未将您的值转换为boolean,因为params被解析为好像它们都是字符串(包括intstring,{ {1}}值)。