LoginSignup
13

More than 1 year has passed since last update.

Rails: ActiveModel でバリデーションエラーを自分で起こす ( raise ActiveRecord::RecordInvalid )

Last updated at Posted at 2015-09-14

クラスの定義。

app/models/book.rb
class Book
  include ActiveModel::Model

  def self.raise_validation_error
    raise ActiveRecord::RecordInvalid.new(self.new)
  end
end

そして例外発生用のメソッドを呼ぶ。

Book.raise_validation_error

ポイント

  • クラスメソッドでは引数として self.new を渡す。
  • インスタンスメソッドでは引数として self を渡す。
  • 詳しい例外メッセージを渡したい場合は、バリデーションを判定した後のモデルを引数として渡す。(後述)

必要性

new メソッドはバリデーションチェックをおこなわない。

Book.new(params)

という風に、モデルチックな関連付けをする場合に。
new の時点でバリデーションチェックをおこない、例外も起こしたかった。

以下は new! メソッドを定義した例。

app/models/book.rb
class Book
  include ActiveModel::Model

  attr_accessor :title

  validates :title, presence: true

  def self.new! (params = [])
    model = self.new(params)

      # invalid? は破壊的メソッド。ここで model にエラー情報が入る。
      if model.invalid?
        # エラー内容を反映した例外が起こる
        raise ActiveRecord::RecordInvalid.new(model)
      end
    model
  end
end

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

メンター受付

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
13