2017-11-15 7 views
0

Rails 4.2のこの動作が何であるか、非常に興味があり、私の質問に対する答えを見つけることができませんでした。どちらが優先されますか:Railsの型キャストまたは検証ですか?

すべての時間属性についてモデルに検証を追加します。数値文字列ではなく、整数だけを受け入れるようにしたい。この属性のスキーマ内のデータ型は整数です。私はそのような検証をしています:

RANGE = 0..59 
validates :start_minute, inclusion: { in: RANGE }, numericality: true 

私はこれらの他のバリデーションも試みました。私は同じ結果を得る。

validates_numericality_of :start_minute, inclusion: { 0..59, only_integer: true } 

validates :start_minute, inclusion: { in: 0..59 }, numericality: { only_integer: true } 

私は、要求仕様から私のコントローラに自分のparamsを渡す、start_minute"12"です。しかし、作成したオブジェクトを見ると、start_minute12です。 this article by ThoughtBotによると

「それはデータベーススキーマと一致するようにアクティブレコードが自動的に入力するためですが、すべての入力をキャスト種類に応じて、これは非常に単純で、または非常に複雑です。」

オブジェクトを作成できませんか?型キャスティングは私の検証より優先されますか?または、私の検証に何か問題がありますか?私はここで何が起こっているのかを判断できなかったので、これに対する洞察を感謝します。私もこのためのモデル仕様を作成して、私はまだ数字の文字列で新しいオブジェクトを作成することができます。

ご連絡ありがとうございます。私はまだフードの下でRailsの魔法を学んでいます。それが言うrails docsから

+0

HTMLのフォームは入力されないため、ユーザー入力は文字列ではありません。 – max

答えて

0

あなたが設定した場合:trueにonly_integer、それは

/\ Aを使用します[+ - ] \ dは+ \ Z/

これは、値の形式がの正規表現と一致し、 '12'のような数字だけを含む文字列値が一致していることを検証します(0の真理値を返します)検証)。

2.3.1 :001 > '12' =~ /\A[+-]?\d+\z/ 
=> 0 
関連する問題