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"
あります。

