aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel
diff options
context:
space:
mode:
Diffstat (limited to 'activemodel')
-rw-r--r--activemodel/README85
-rw-r--r--activemodel/lib/active_model/attribute_methods.rb2
-rw-r--r--activemodel/lib/active_model/naming.rb2
-rw-r--r--activemodel/lib/active_model/serializers/xml.rb4
4 files changed, 42 insertions, 51 deletions
diff --git a/activemodel/README b/activemodel/README
index 0d6fd1f21c..3945a6da06 100644
--- a/activemodel/README
+++ b/activemodel/README
@@ -11,9 +11,9 @@ Active Model is a solution for this problem.
Active Model provides a known set of interfaces that your objects can implement
to then present a common interface to the Action Pack helpers. You can include
functionality from the following modules:
-
+
* Adding attribute magic to your objects
-
+
Add prefixes and suffixes to defined attribute methods...
class Person
@@ -34,7 +34,7 @@ functionality from the following modules:
{Learn more}[link:classes/ActiveModel/AttributeMethods.html]
* Adding callbacks to your objects
-
+
class Person
extend ActiveModel::Callbacks
define_model_callbacks :create
@@ -50,19 +50,19 @@ functionality from the following modules:
wrap your create method.
{Learn more}[link:classes/ActiveModel/CallBacks.html]
-
+
* For classes that already look like an Active Record object
-
+
class Person
include ActiveModel::Conversion
end
...returns the class itself when sent :to_model
-
+
{Learn more}[link:classes/ActiveModel/Conversion.html]
-
+
* Tracking changes in your object
-
+
Provides all the value tracking features implemented by ActiveRecord...
person = Person.new
@@ -77,29 +77,29 @@ functionality from the following modules:
person.previous_changes # => {'name' => ['bob, 'robert']}
{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...
@@ -108,18 +108,18 @@ functionality from the following modules:
# => ["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...
@@ -131,19 +131,19 @@ functionality from the following modules:
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]
-
+
* Making your object serializable
-
+
ActiveModel::Serialization provides a standard interface for your object
to provide to_json or to_xml serialization...
@@ -153,48 +153,37 @@ functionality from the following modules:
s.to_xml # => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<serial-person...
{Learn more}[link:classes/ActiveModel/Serialization.html]
-
-
-* Turning your object into a finite State Machine
-
- ActiveModel::StateMachine provides a clean way to include all the methods
- you need to transform your object into a finite State Machine...
-
- light = TrafficLight.new
- light.current_state #=> :red
- light.change_color! #=> true
- light.current_state #=> :green
-
- {Learn more}[link:classes/ActiveModel/StateMachine.html]
-
+
* Integrating with Rail's internationalization (i18n) handling through
ActiveModel::Translations...
-
+
class Person
extend ActiveModel::Translation
end
{Learn more}[link:classes/ActiveModel/Translation.html]
-
+
* Providing a full Validation stack for your objects...
-
+
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(:first_name => 'zoolander')
person.valid? #=> false
-
+
{Learn more}[link:classes/ActiveModel/Validations.html]
* Make custom validators
-
+
class Person
include ActiveModel::Validations
validates_with HasNameValidator
@@ -212,5 +201,5 @@ functionality from the following modules:
p.errors.full_messages #=> ["Name must exist"]
p.name = "Bob"
p.valid? #=> true
-
+
{Learn more}[link:classes/ActiveModel/Validator.html]
diff --git a/activemodel/lib/active_model/attribute_methods.rb b/activemodel/lib/active_model/attribute_methods.rb
index 200a6afbf0..f7fb66bdfc 100644
--- a/activemodel/lib/active_model/attribute_methods.rb
+++ b/activemodel/lib/active_model/attribute_methods.rb
@@ -50,7 +50,6 @@ module ActiveModel
module AttributeMethods
extend ActiveSupport::Concern
- # Declare and check for suffixed attribute methods.
module ClassMethods
# Defines an "attribute" method (like +inheritance_column+ or
# +table_name+). A new (class) method will be created with the
@@ -283,6 +282,7 @@ module ActiveModel
end
end
+ # Returns true if the attribute methods defined have been generated.
def attribute_methods_generated?
@attribute_methods_generated ||= nil
end
diff --git a/activemodel/lib/active_model/naming.rb b/activemodel/lib/active_model/naming.rb
index 89e8f8b1ea..b9fb5fe0c8 100644
--- a/activemodel/lib/active_model/naming.rb
+++ b/activemodel/lib/active_model/naming.rb
@@ -1,6 +1,7 @@
require 'active_support/inflector'
module ActiveModel
+
class Name < String
attr_reader :singular, :plural, :element, :collection, :partial_path
alias_method :cache_key, :collection
@@ -57,4 +58,5 @@ module ActiveModel
@_model_name ||= ActiveModel::Name.new(self)
end
end
+
end
diff --git a/activemodel/lib/active_model/serializers/xml.rb b/activemodel/lib/active_model/serializers/xml.rb
index 86149f1e5f..a185204680 100644
--- a/activemodel/lib/active_model/serializers/xml.rb
+++ b/activemodel/lib/active_model/serializers/xml.rb
@@ -85,8 +85,8 @@ module ActiveModel
@options[:except] = Array.wrap(@options[:except]).map { |n| n.to_s }
end
- # To replicate the behavior in ActiveRecord#attributes,
- # <tt>:except</tt> takes precedence over <tt>:only</tt>. If <tt>:only</tt> is not set
+ # To replicate the behavior in ActiveRecord#attributes, <tt>:except</tt>
+ # takes precedence over <tt>:only</tt>. If <tt>:only</tt> is not set
# for a N level model but is set for the N+1 level models,
# then because <tt>:except</tt> is set to a default value, the second
# level model can have both <tt>:except</tt> and <tt>:only</tt> set. So if