rails--rails/activemodel/README

144 lines
3.8 KiB
Plaintext
Raw Normal View History

2010-01-14 21:19:53 +00:00
= Active Model - defined interfaces for Rails
2010-01-14 21:19:53 +00:00
Prior to Rails 3.0, if a plugin or gem developer wanted to be able 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 look like Active Record. This generated code
duplication and fragile applications that broke on upgrades.
2010-01-14 21:19:53 +00:00
Active Model is a solution for this problem.
2010-01-14 21:19:53 +00:00
Active Model provides a known set of interfaces that your objects can implement
2010-01-16 12:03:20 +00:00
to then present a common interface to the Action Pack helpers. You can include
functionality from the following modules:
2010-01-14 21:19:53 +00:00
* Adding attribute magic to your objects
Add prefixes and suffixes to defined attribute methods...
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
...gives you clear_name, clear_age.
{Learn more}[link:classes/ActiveModel/AttributeMethods.html]
2010-01-16 12:09:32 +00:00
* Adding callbacks to your objects
class Person
2010-01-16 12:09:32 +00:00
extend ActiveModel::Callbacks
define_model_callbacks :create
def create
_run_create_callbacks do
# Your create action methods here
end
end
end
...gives you before_create, around_create and after_create class methods that
wrap your create method.
2010-01-14 21:19:53 +00:00
{Learn more}[link:classes/ActiveModel/CallBacks.html]
2010-01-14 21:29:08 +00:00
* For classes that already look like an Active Record object
class Person
2010-01-14 21:29:08 +00:00
include ActiveModel::Conversion
end
...returns the class itself when sent :to_model
2010-01-16 12:09:32 +00:00
{Learn more}[link:classes/ActiveModel/Conversion.html]
2010-01-14 23:01:40 +00:00
* Tracking changes in your object
2010-01-16 12:03:20 +00:00
Provides all the value tracking features implemented by ActiveRecord...
2010-01-14 23:01:40 +00:00
2010-01-16 11:21:07 +00:00
person = Person.new
person.name # => nil
2010-01-14 23:01:40 +00:00
person.changed? # => false
person.name = 'bob'
person.changed? # => true
person.changed # => ['name']
2010-01-16 11:21:07 +00:00
person.changes # => { 'name' => [nil, 'bob'] }
2010-01-14 23:01:40 +00:00
person.name = 'robert'
person.save
person.previous_changes # => {'name' => ['bob, 'robert']}
2010-01-16 11:21:07 +00:00
2010-01-16 12:03:20 +00:00
{Learn more}[link:classes/ActiveModel/Dirty.html]
* Adding +errors+ support to your object
Provides the error messages to allow your object 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
... gives you...
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]
* Testing the compliance of your object
Use ActiveModel::Lint to test the compliance of your object to the
basic ActiveModel API...
{Learn more}[link:classes/ActiveModel/Lint/Tests.html]
* Providing a human face to your object
ActiveModel::Naming provides your model with the model_name convention
and a human_name attribute...
class NamedPerson
extend ActiveModel::Naming
end
...gives you...
NamedPerson.model_name #=> "NamedPerson"
NamedPerson.model_name.human #=> "Named person"
{Learn more}[link:classes/ActiveModel/Naming.html]
* Adding observer support to your objects
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]