【Rails】numericalityを使って属性に数値のみが使われている事を検証する


こんばんは!
validationのnumericalityヘルパーの備忘録

DBに保存されちゃう

views/sample.html.erb
<%= form_for @post do |f| %>
  <%= f.label :price %>
  <%= f.text_field :price %>
<% end %>

form_for内のtext_fieldに全角数字を入れるとDBには「0」で保存されてしまう。カラムの型はinteger

modelにnumericalityを追加

models/sample.rb
class Post < ApplicationRecord
  validates :price, numericality: { only_integer: true }
end

:only_integertrueに設定すると、属性の値に対するvalidationで/\A[+-]?\d+\z/の正規表現が使われます。これで全角数字はDBに保存されず弾かれるようになります

オプション色々

:greater_than

指定された値よりも大きくなければならないことを指定します。デフォルトのエラーメッセージは「must be greater than %{count}」です。

:greater_than_or_equal_to

指定された値と等しいか、それよりも大きくなければならないことを指定します。デフォルトのエラーメッセージは「must be greater than or equal to %{count}」です。

:equal_to:

指定された値と等しくなければならないことを示します。デフォルトのエラーメッセージは「must be equal to %{count}」です。

:less_than:

指定された値よりも小さくなければならないことを指定します。デフォルトのエラーメッセージは「must be less than %{count}」です。

:less_than_or_equal_to:

指定された値と等しいか、それよりも小さくなければならないことを指定します。デフォルトのエラーメッセージは「must be
less than or equal to %{count}」です。

:other_than:

渡した値以外の値でなければならないことを指定します。デフォルトのエラーメッセージは「must be other than %{count}」です。

:odd:

trueの場合は奇数でなければなりません。デフォルトのエラーメッセージは「must be odd」です。
:even: trueの場合は偶数でなければなりません。デフォルトのエラーメッセージは「must be even」です。

まとめ

整数の値のみ扱いたいのでればnumber_field使えばいい事に気づきました

終わり