diff options
Diffstat (limited to 'activemodel')
-rw-r--r-- | activemodel/README | 85 | ||||
-rw-r--r-- | activemodel/lib/active_model/attribute_methods.rb | 2 | ||||
-rw-r--r-- | activemodel/lib/active_model/naming.rb | 2 | ||||
-rw-r--r-- | activemodel/lib/active_model/serializers/xml.rb | 4 |
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 |