ActiveModel

2010年9月15日

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"

あります。

アンケート