訂正(2023/06/05)
jnchitoさんからのご指摘を受け、#41022が正式に反映されたのが7-0-stableブランチ(Rails 7.0.0.alpha1以降)からであることを確認し、タイトルを修正しました。ありがとうございます!
Rails 7: 数値バリデーションを範囲(..)で指定できるinオプションが追加(翻訳)
numericality
バリデーションヘルパーは、特定の範囲に収まるべき数値をバリデーションするための:greater_than_or_equal_to
、:less_than_or_equal_to
、あるいは :greater_than
や:less_than
といったオプションを提供しています。オプション名を見ればどのようなバリデーションを期待しているかがすぐわかるので、理解がはかどります。
でも、コードのシンプルさも表現力も損なわずに入力量を節約できる方法があれば素晴らしいと思いませんか?
最近のRailsの更新ではこの点が改善され、バリデーションしたい値の範囲を指定できる in:
オプションが使えるようになりました(#41022)。
Rubyでは、以下のような範囲指定を日常的に用います。
range = (1..5)
range.each { |n| puts n } # => 1, 2, 3, 4, 5
たとえば、プロフィールの詳細に入力するユーザーの年齢を18〜65歳の間で入力してもらいたいとします。
変更前
従来だと以下のような書き方になったでしょう。
class User < ApplicationRecord
validates :age, numericality: { greater_than_or_equal_to: 18, less_than_or_equal_to: 65 }
end
変更後
in:
オプションを使うことで、同じことを以下のように書けるようになりました。
class User < ApplicationRecord
validates :age, numericality: { in: 18..65 }
end
age
の値が18
〜65
の範囲に収まらないUserを追加しようとすると、以下のようになります。
User.create!(name: "Chris", age: 14)
# => ActiveRecord::RecordInvalid (Validation failed: Age must be greater than or equal to 18)
概要
原著者の許諾を得て翻訳・公開いたします。
日本語タイトルは内容に即したものにしました。
以下の関連記事もどうぞ。
numericality
にrange..
で値を渡せるようになった