カスタムバリデーターとはバリデーションを好みにカスタマイズできてしまうもの。
自分ルールが作れる!
備忘録として一連の流れを書いていきます。
登録フォームでのsave時にこのvalidatorを発動させます。
ユーザーが銀行コードを入力し、そのコードがBankテーブル上に存在しなければ(そのコードに合致する銀行は存在しませんという内容の)警告を表示させるようなイメージです。
= form_for @bank_account do |f|
= f.text_field :bank_code #銀行コード
= f.text_field :account_num #口座番号 物足りなかったので書いただけで特にカスタムバリデーターとは関係ないです
= f.submit
続いてカスタムバリデーターの本体を作成し定義する
app/validators/bank_validator.rbというファイルを作成
class BankValidator < ActiveModel::EachValidator #classはファイル名で
def validate_each(record, attribute, value) #ここの引数たちはおまじないだと思って問題ない
unless Bank.find_by(code: value) # 銀行のテーブルを参照しその中のcodeの値と受け取ったvalueを比較する => falseならバリデーター発動!!!!!
record.errors[attribute] << (options[:message] || "は正しくありません") # ここも意味がわからなかったらコピペで全然おkです
end
end
end
参考までに引数たちに何が入ってるのか確認してみると
p record
=> BankAccount id: nil, bank_code: "aaaaa", created_at: nil, updated_at: nil>
p attribute
=> :bank_code
p value
=> "aaaaa"
こんな感じで入ってます!
最後にモデル内の設定
presence: trueはご存知だと思いますが、その後ろのbank: trueが重要です。
class BankAccount < ApplicationRecord
validates :bank_code, presence: true, bank: true #ここの最後の部分でカスタムバリデーターを使いますよという合図
end
できてますね!
[参考railsガイド-validator]
(http://railsguides.jp/active_record_validations.html#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B)