123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- = Active Model -- model interfaces for Rails
- Active Model provides a known set of interfaces for usage in model classes.
- They allow for Action Pack helpers to interact with non-ActiveRecord models,
- for example. Active Model also helps building custom ORMs for use outside of
- the Rails framework.
- Prior to Rails 3.0, if a plugin or gem developer wanted to have an object
- interact with Action Pack helpers, it was required to either copy chunks of
- code from Rails, or monkey patch entire helpers to make them handle objects
- that did not exactly conform to the Active Record interface. This would result
- in code duplication and fragile applications that broke on upgrades.
- Active Model solves this. You can include functionality from the following
- modules:
- * Add attribute magic to objects
- 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
- {Learn more}[link:classes/ActiveModel/AttributeMethods.html]
- * Callbacks for certain operations
- class Person
- extend ActiveModel::Callbacks
- define_model_callbacks :create
- def create
- run_callbacks :create do
- # Your create action methods here
- end
- end
- end
- This generates +before_create+, +around_create+ and +after_create+
- class methods that wrap your create method.
- {Learn more}[link:classes/ActiveModel/Callbacks.html]
- * Tracking value changes
- The ActiveModel::Dirty module allows for tracking attribute changes:
- 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']}
- {Learn more}[link:classes/ActiveModel/Dirty.html]
- * Adding +errors+ interface to objects
- Exposing error messages allows objects to interact with Action Pack
- helpers seamlessly.
- 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
- person.errors.full_messages
- # => ["Name can not be nil"]
- person.errors.full_messages
- # => ["Name can not be nil"]
- {Learn more}[link:classes/ActiveModel/Errors.html]
- * Model name introspection
- class NamedPerson
- extend ActiveModel::Naming
- end
- NamedPerson.model_name # => "NamedPerson"
- NamedPerson.model_name.human # => "Named person"
- {Learn more}[link:classes/ActiveModel/Naming.html]
- * Observer support
- ActiveModel::Observers allows your object to implement the Observer
- pattern in a Rails App and take advantage of all the standard observer
- functions.
- {Learn more}[link:classes/ActiveModel/Observer.html]
- * Making objects serializable
- ActiveModel::Serialization provides a standard interface for your object
- to provide +to_json+ or +to_xml+ serialization.
- s = SerialPerson.new
- s.serializable_hash # => {"name"=>nil}
- s.to_json # => "{\"name\":null}"
- s.to_xml # => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<serial-person...
- {Learn more}[link:classes/ActiveModel/Serialization.html]
- * Internationalization (i18n) support
- class Person
- extend ActiveModel::Translation
- end
- Person.human_attribute_name('my_attribute')
- # => "My attribute"
- {Learn more}[link:classes/ActiveModel/Translation.html]
- * Validation support
- 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
- {Learn more}[link:classes/ActiveModel/Validations.html]
- * Custom validators
- class Person
- include ActiveModel::Validations
- validates_with HasNameValidator
- attr_accessor :name
- end
- class HasNameValidator < ActiveModel::Validator
- def validate(record)
- record.errors[:name] = "must exist" if record.name.blank?
- end
- end
- p = ValidatorPerson.new
- p.valid? # => false
- p.errors.full_messages # => ["Name must exist"]
- p.name = "Bob"
- p.valid? # => true
- {Learn more}[link:classes/ActiveModel/Validator.html]
-
- == Download and installation
- The latest version of Active Model can be installed with RubyGems:
- % [sudo] gem install activemodel
- Source code can be downloaded as part of the Rails project on GitHub
- * https://github.com/rails/rails/tree/3-2-stable/activemodel
- == License
- Active Model is released under the MIT license.
- == Support
- API documentation is at
- * http://api.rubyonrails.org
- Bug reports and feature requests can be filed with the rest for the Ruby on Rails project here:
- * https://github.com/rails/rails/issues
|