ActiveModel
Rails 3からActiveModelが追加されたが、これはどーいうものかというと、
ActiveRecordはテーブルのデータを操作するのに対して
ActiveModelはテーブルの存在しないデータを操作するために使用する。
と思う。
ActiveModelの肝は大きくみて4つくらいあるらしい。
- アトリビュート
- コールバック
- 変更記憶
- バリデーション
ほかにもいくつか楽しそうな物はあるが、とりあえず、この4つについてREADMEから情報を拾ってみたいと思います。
アトリビュートは、モデル内に項目を作る
class Person include ActiveModel::AttributeMethods attribute_method_prefix 'clear_' define_attribute_methods [:name, :age] attr_accessor :name, :age def clear_attribute(attr) send("#{attr}=", nil) end end person.clear_name person.clear_age
コールバック
class Person extend ActiveModel::Callbacks define_model_callbacks :create def create _run_create_callbacks do # Your create action methods here end end end
これで、before_createとかafter_createとか使える
変更記憶
class Person include ActiveModel::Dirty attr_accessor :name, :age end person = Person.new person.name # => nil person.changed? # => false person.name = 'bob' person.changed? # => true person.changed # => ['name'] person.changes # => { 'name' => [nil, 'bob'] } person.name = 'robert' person.save person.previous_changes # => {'name' => ['bob, 'robert']}
バリデーション
class Person include ActiveModel::Validations attr_accessor :first_name, :last_name validates_each :first_name, :last_name do |record, attr, value| record.errors.add attr, 'starts with z.' if value.to_s[0] == ?z end end person = Person.new person.first_name = 'zoolander' person.valid? # => false
そのほかにも、
errorsインターフェース実装
class Person def initialize @errors = ActiveModel::Errors.new(self) end attr_accessor :name attr_reader :errors def validate! errors.add(:name, "can not be nil") if name == nil end def ErrorsPerson.human_attribute_name(attr, options = {}) "Name" end end
とか
I18nサポートとか
class Person extend ActiveModel::Translation end Person.human_attribute_name('my_attribute') # => "My attribute"
あります。