カスタムバリデーターとはバリデーションを好みにカスタマイズできてしまうもの。
自分ルールが作れる!
備忘録として一連の流れを書いていきます。
登録フォームでのsave時にこのvalidatorを発動させます。
ユーザーが銀行コードを入力し、そのコードがBankテーブル上に存在しなければ(そのコードに合致する銀行は存在しませんという内容の)警告を表示させるようなイメージです。
new.html.slim
= form_for @bank_account do |f|
= f.text_field :bank_code #銀行コード
= f.text_field :account_num #口座番号 物足りなかったので書いただけで特にカスタムバリデーターとは関係ないです
= f.submit
続いてカスタムバリデーターの本体を作成し定義する
app/validators/bank_validator.rbというファイルを作成
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が重要です。
bank_account.rb
class BankAccount < ApplicationRecord
validates :bank_code, presence: true, bank: true #ここの最後の部分でカスタムバリデーターを使いますよという合図
end
できてますね!