LoginSignup
4
3

More than 5 years have passed since last update.

カスタムバリデーター便利だった>_<

Posted at

カスタムバリデーターとはバリデーションを好みにカスタマイズできてしまうもの。

自分ルールが作れる! :neckbeard:

備忘録として一連の流れを書いていきます。
登録フォームでの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

bank_codeをaaaaaでsubmitした結果
160818-0001.png

できてますね!

参考railsガイド-validator

4
3
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
4
3