バリデーションエラーと@messegesの動きを見てみた

例えば、blogsテーブルにcontentというカラムを用意。

models/blog.rbで

class Blog < ActiveRecord::Base
  validates :content, presence: true

end

として、contentは必須とする。

ここでrails cを実行。

irb(main):001:0> @blog = Blog.new
=> #<Blog id: nil, content: nil, created_at: nil, updated_at: nil>

このままだと中身がからっぽのオブジェクトが生成される。
もちろん、contentもからっぽ(nil)。
ここでsaveしてみる。

irb(main):002:0> @blog.save
   (0.3ms)  BEGIN
   (0.4ms)  ROLLBACK
=> false

案の定、false。
続いてerrorsメソッドを使ってみる。

irb(main):003:0> @blog.errors
=> #<ActiveModel::Errors:0x007f874e717488 @base=#<Blog id: nil, content: nil, created_at: nil, updated_at: nil>, @messages={:content=>["can't be blank"]}>

エラーが発生した場合は、レシーバ(この場合は@blog)にエラーメッセージが格納される。

irb(main):004:0* @blog.errors.full_messages
=> ["Content can't be blank"]

full_messagesメソッドで、格納されたエラーメッセージを取り出すことができた。