2017-01-31 5 views
0

以下のコードで示すように、同じフォームのチェックボックスの値に基づいてActiveModelオブジェクトのフォーム値を検証しようとしています。 ボックスがチェックされている場合(trueではなく1が返されます)、order_numberのバリデーションは、フィールドが非アクティブ化されている(JSによって)ので、無効にする必要があります。チェックボックスnot_a_customerに接続されている属性を使用して、order_numberの妥当性検査の条件として以下の単純なアプローチが機能しませんでした。Rails 5:ActiveModelの条件付き検証を実装する方法は?

他に何を試すことができますか?

私は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') 
+2

上記のコードを試してみるとどのようなエラーが表示されますか? –

+0

エラーはありません、私はそれが欲しいと検証していません。私はorder_numberを空白のままにして、ボックスをチェックしないでおくことができます。チェックボックスをオンにした場合のみ、注文番号が空白のままにすることが可能です。 – Flip

+0

私はそれを正しく理解していれば、チェックボックスがチェックされていない場合のみ、検証が実行されます。右? –

答えて

1

not_a_customerの値を確認してください。ブーリアン値の代わりに文字列を取得するだけです。これは常に真実です(「真」、「偽」とも真理値)。

Railsでは、not_a_customer.to_boolを使用してブール値に変換できます。彼らは(intstringboolean値を含む)すべての文字列があるかのようにparamsが解析されているので

checkboxは、booleanにあなたの値を変換しません。

+0

文字列の値については絶対に正しいです。興味深いことに、この行を変更した後(チェックボックスに1/0の代わりにtrue/falseを指定して追加した場合)、 '= f.check_box:not_a_customer、{}、 'true'、' false''to '= f.check_box :not_a_customer、{}、true、false'それはparamsハッシュではまだ文字列値として表示されますが、突然動作します。 – Flip

+0

@Flip hmm ..それは面白いです。しかし、私はあまりそれに頼っておらず、 'to_bool'を使っています。私はparamパーサを調べる必要があります。リクエストがクライアントからサーバーに送信されるとき、それはちょうど1つの巨大な文字列であることに注意してください。だからレール5が文字列に引用符が付いているかどうかをチェックし、それをどのように解析するかを決めるでしょう... –

+0

@Flip私が遭遇した良い例は、空の入力が空の文字列(おそらく明白なもの)に変換されます。同じロジックが与えられれば、それは 'nil'でなければなりません。私の持ち帰りは魔法に依存していなかった。 –

関連する問題