うまとま君の技術めも

2015年新卒入社した社畜の勉強内容などなど

Railsで独自クラスにバリデーションを実装してみる

環境

独自クラスにValidationを実装

独自クラスでRailsのValidationを実装したい場合はActiveModel::Validationsをincludeしてあげればよいらしい。

class Hoge
  include ActiveModel::Validations

  validates :hoge_id, presence: true
  
  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end
end

これで、大丈夫かと思ったがNoMethodErrorが出てしまった。

[1] pry(main)> Hoge.new(hoge_id: 100)
NoMethodError: undefined method `hoge_id=' for #<Hoge:0x007fc71ce47bf0>
from /path/to/hoge.rb:8:in `block in initialize'

なので、attr_accessor :hoge_idを指定してあげればエラーは消えた.

class Hoge
  include ActiveModel::Validations

  attr_accessor :hoge_id # 追加

  validates :hoge_id, presence: true
  
  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end
end

これで、ひとまず独自クラスでもバリデーションを行うことが出来るようになりました。

[5] pry(main)> hoge = Hoge.new(hoge_id: nil)
[6] pry(main)> hoge.valid?
=> false
[7] pry(main)> hoge.errors.full_messages
=> ["Hogeを入力してください。"]

参考