バリデーションエラーと@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メソッドで、格納されたエラーメッセージを取り出すことができた。