状況によってvalidationを変える(Ruby on Rails)その2
以前、
状況によってvalidationを変える(Ruby on Rails)というブログを書き、on contextで指定するという方法を記事にしました。
今回はその続きです。
on contextという方法は、状況に応じて少し変えるという際には楽だったのですが、
validationがだんだん複雑になってくるにつれて、
かくコードの量が多くなり、煩雑になりがちです。
そこでwith_optionsを用いると綺麗にまとめて書く事ができます。
仮に下記のようなモデルがあったとします(商品モデル)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # == Schema Information # # Table name: product # # id :integer not null, primary key # product_name :string(255) # price :float(24) # product_code :string(255) # created_at :datetime not null # updated_at :datetime not null # # class Product < ActiveRecord::Base end |
いろいろと省略しますが、システムとして登録される商品の値段の通貨が日本円のときだけ、priceの型をintegerにしたいというvalidationがあれば下記のようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # == Schema Information # # Table name: product # # id :integer not null, primary key # product_name :string(255) # price :float(24) # product_code :string(255) # created_at :datetime not null # updated_at :datetime not null # # class Product < ActiveRecord::Base with_options if: :jpy? do validates :price, presence: true, numericality: { only_integer: true } end def jpy? return true if 基軸通貨が日本円かどうか false end end |
のような形で書く事ができます。on contextより汎用性が高いと思います。
Author Profile
スターフィールド編集部
SHARE