LoginSignup
39
35

More than 1 year has passed since last update.

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

Last updated at Posted at 2019-10-19

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

DBに保存されちゃう

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

スクリーンショット 2019-10-19 20.11.06.png

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

スクリーンショット 2019-10-19 20.12.56.png

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使えばいい事に気づきました

終わり

39
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
35