mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Renamed Mixins to Acts to resemble the change from include ActiveRecord::Mixins::List to acts_as_list and renamed @@default_error_messagess to @@default_error_messages
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@190 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
12f10f6baf
commit
6860db61f5
9 changed files with 106 additions and 30 deletions
|
@ -57,18 +57,26 @@ A short rundown of the major features:
|
|||
|
||||
* Validation rules that can differ for new or existing objects.
|
||||
|
||||
class Post < ActiveRecord::Base
|
||||
def validate # validates on both creates and updates
|
||||
errors.add_on_empty "title"
|
||||
end
|
||||
|
||||
def validate_on_update
|
||||
errors.add_on_empty "password"
|
||||
end
|
||||
end
|
||||
class Account < ActiveRecord::Base
|
||||
validates_presence_of :subdomain, :name, :email_address, :password
|
||||
validates_uniqueness_of :subdomain
|
||||
validates_acceptance_of :terms_of_service, :on => :create
|
||||
validates_confirmation_of :password, :email_address, :on => :create
|
||||
end
|
||||
|
||||
Learn more in link:classes/ActiveRecord/Validations.html
|
||||
|
||||
|
||||
* Acts that can make records work as lists or trees:
|
||||
|
||||
class Item < ActiveRecord::Base
|
||||
belongs_to :list
|
||||
acts_as_list :scope => :list
|
||||
end
|
||||
|
||||
item.move_higher
|
||||
item.move_to_bottom
|
||||
|
||||
|
||||
* Callbacks as methods or queues on the entire lifecycle (instantiation, saving, destroying, validating, etc).
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ unless $sitedir
|
|||
end
|
||||
end
|
||||
|
||||
makedirs = %w{ active_record/associations active_record/connection_adapters active_record/support active_record/vendor active_record/mixins }
|
||||
makedirs = %w{ active_record/associations active_record/connection_adapters active_record/support active_record/vendor active_record/acts }
|
||||
makedirs.each {|f| File::makedirs(File.join($sitedir, *f.split(/\//)))}
|
||||
|
||||
# deprecated files that should be removed
|
||||
|
|
|
@ -36,8 +36,8 @@ require 'active_record/aggregations'
|
|||
require 'active_record/transactions'
|
||||
require 'active_record/reflection'
|
||||
require 'active_record/timestamp'
|
||||
require 'active_record/mixins/list'
|
||||
require 'active_record/mixins/tree'
|
||||
require 'active_record/acts/list'
|
||||
require 'active_record/acts/tree'
|
||||
|
||||
ActiveRecord::Base.class_eval do
|
||||
include ActiveRecord::Validations
|
||||
|
@ -47,8 +47,8 @@ ActiveRecord::Base.class_eval do
|
|||
include ActiveRecord::Transactions
|
||||
include ActiveRecord::Reflection
|
||||
include ActiveRecord::Timestamp
|
||||
include ActiveRecord::Mixins::Tree
|
||||
include ActiveRecord::Mixins::List
|
||||
include ActiveRecord::Acts::Tree
|
||||
include ActiveRecord::Acts::List
|
||||
end
|
||||
|
||||
require 'active_record/connection_adapters/mysql_adapter'
|
||||
|
|
|
@ -2,7 +2,7 @@ module ActiveRecord
|
|||
# Mixins are a way of decorating existing Active Record models with additional behavior. If you for example
|
||||
# want to keep a number of Documents in order, you can include Mixins::List, and all of the sudden be able to
|
||||
# call <tt>document.move_to_bottom</tt>.
|
||||
module Mixins
|
||||
module Acts
|
||||
# This mixin provides the capabilities for sorting and reordering a number of objects in list.
|
||||
# The class that has this mixin included needs to have a "position" column defined as an integer on
|
||||
# the mapped database table. Further more, you need to implement the <tt>scope_condition</tt> if you want
|
34
activerecord/lib/active_record/acts/mixins/touch.rb
Normal file
34
activerecord/lib/active_record/acts/mixins/touch.rb
Normal file
|
@ -0,0 +1,34 @@
|
|||
module ActiveRecord
|
||||
module Mixins
|
||||
# Including this mixins will record when objects of the class are created in a datetime column called "created_at"
|
||||
# and when its updated in another datetime column called "updated_at".
|
||||
#
|
||||
# class Bill < ActiveRecord::Base
|
||||
# include ActiveRecord::Mixins::Touch
|
||||
# end
|
||||
#
|
||||
# bill = Bill.create("amount" => 100)
|
||||
# bill.created_at # => Time.now at the moment of Bill.create
|
||||
# bill.updated_at # => Time.now at the moment of Bill.create
|
||||
#
|
||||
# bill.update_attribute("amount", 150)
|
||||
# bill.created_at # => Time.now at the moment of Bill.create
|
||||
# bill.updated_at # => Time.now at the moment of bill.update_attribute
|
||||
module Touch
|
||||
def self.append_features(base)
|
||||
super
|
||||
|
||||
base.before_create :touch_on_create
|
||||
base.before_update :touch_on_update
|
||||
end
|
||||
|
||||
def touch_on_create
|
||||
self.updated_at = (self.created_at ||= Time.now)
|
||||
end
|
||||
|
||||
def touch_on_update
|
||||
self.updated_at = Time.now
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
34
activerecord/lib/active_record/acts/touch.rb
Normal file
34
activerecord/lib/active_record/acts/touch.rb
Normal file
|
@ -0,0 +1,34 @@
|
|||
module ActiveRecord
|
||||
module Mixins
|
||||
# Including this mixins will record when objects of the class are created in a datetime column called "created_at"
|
||||
# and when its updated in another datetime column called "updated_at".
|
||||
#
|
||||
# class Bill < ActiveRecord::Base
|
||||
# include ActiveRecord::Mixins::Touch
|
||||
# end
|
||||
#
|
||||
# bill = Bill.create("amount" => 100)
|
||||
# bill.created_at # => Time.now at the moment of Bill.create
|
||||
# bill.updated_at # => Time.now at the moment of Bill.create
|
||||
#
|
||||
# bill.update_attribute("amount", 150)
|
||||
# bill.created_at # => Time.now at the moment of Bill.create
|
||||
# bill.updated_at # => Time.now at the moment of bill.update_attribute
|
||||
module Touch
|
||||
def self.append_features(base)
|
||||
super
|
||||
|
||||
base.before_create :touch_on_create
|
||||
base.before_update :touch_on_update
|
||||
end
|
||||
|
||||
def touch_on_create
|
||||
self.updated_at = (self.created_at ||= Time.now)
|
||||
end
|
||||
|
||||
def touch_on_update
|
||||
self.updated_at = Time.now
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,5 +1,5 @@
|
|||
module ActiveRecord
|
||||
module Mixins
|
||||
module Acts
|
||||
# Including this mixin if you want to model a tree structure by providing a parent association and an children
|
||||
# association. This mixin assumes that you have a column called parent_id
|
||||
#
|
|
@ -76,7 +76,7 @@ module ActiveRecord
|
|||
# ::message: A custom error message (default is: "doesn't match confirmation")
|
||||
# ::on: Specifies when this validation is active (default is :save, other options :create, :update)
|
||||
def validates_confirmation_of(*attr_names)
|
||||
configuration = { :message => ActiveRecord::Errors.default_error_messagess[:confirmation], :on => :save }
|
||||
configuration = { :message => ActiveRecord::Errors.default_error_messages[:confirmation], :on => :save }
|
||||
configuration.update(attr_names.pop) if attr_names.last.is_a?(Hash)
|
||||
|
||||
for attr_name in attr_names
|
||||
|
@ -100,7 +100,7 @@ module ActiveRecord
|
|||
#
|
||||
# NOTE: The agreement is considered valid if it's set to the string "1". This makes it easy to relate it to an HTML checkbox.
|
||||
def validates_acceptance_of(*attr_names)
|
||||
configuration = { :message => ActiveRecord::Errors.default_error_messagess[:accepted], :on => :save }
|
||||
configuration = { :message => ActiveRecord::Errors.default_error_messages[:accepted], :on => :save }
|
||||
configuration.update(attr_names.pop) if attr_names.last.is_a?(Hash)
|
||||
|
||||
for attr_name in attr_names
|
||||
|
@ -115,7 +115,7 @@ module ActiveRecord
|
|||
# ::message: A custom error message (default is: "has already been taken")
|
||||
# ::on: Specifies when this validation is active (default is :save, other options :create, :update)
|
||||
def validates_presence_of(*attr_names)
|
||||
configuration = { :message => ActiveRecord::Errors.default_error_messagess[:empty], :on => :save }
|
||||
configuration = { :message => ActiveRecord::Errors.default_error_messages[:empty], :on => :save }
|
||||
configuration.update(attr_names.pop) if attr_names.last.is_a?(Hash)
|
||||
|
||||
for attr_name in attr_names
|
||||
|
@ -136,7 +136,7 @@ module ActiveRecord
|
|||
# ::too_short: The error message if the attributes go under the boundary (default is: "is too short (min is %d characters)")
|
||||
# ::on: Specifies when this validation is active (default is :save, other options :create, :update)
|
||||
def validates_boundaries_of(*attr_names)
|
||||
configuration = { :within => 5..20, :too_long => ActiveRecord::Errors.default_error_messagess[:too_long], :too_short => ActiveRecord::Errors.default_error_messagess[:too_short], :on => :save }
|
||||
configuration = { :within => 5..20, :too_long => ActiveRecord::Errors.default_error_messages[:too_long], :too_short => ActiveRecord::Errors.default_error_messages[:too_short], :on => :save }
|
||||
configuration.update(attr_names.pop) if attr_names.last.is_a?(Hash)
|
||||
|
||||
for attr_name in attr_names
|
||||
|
@ -157,7 +157,7 @@ module ActiveRecord
|
|||
# Configuration options:
|
||||
# ::message: Specifies a custom error message (default is: "has already been taken")
|
||||
def validates_uniqueness_of(*attr_names)
|
||||
configuration = { :message => ActiveRecord::Errors.default_error_messagess[:taken] }
|
||||
configuration = { :message => ActiveRecord::Errors.default_error_messages[:taken] }
|
||||
configuration.update(attr_names.pop) if attr_names.last.is_a?(Hash)
|
||||
|
||||
for attr_name in attr_names
|
||||
|
@ -179,7 +179,7 @@ module ActiveRecord
|
|||
# ::with: The regular expression used to validate the format with (note: must be supplied!)
|
||||
# ::on: Specifies when this validation is active (default is :save, other options :create, :update)
|
||||
def validates_format_of(*attr_names)
|
||||
configuration = { :message => ActiveRecord::Errors.default_error_messagess[:invalid], :on => :save, :with => nil }
|
||||
configuration = { :message => ActiveRecord::Errors.default_error_messages[:invalid], :on => :save, :with => nil }
|
||||
configuration.update(attr_names.pop) if attr_names.last.is_a?(Hash)
|
||||
|
||||
raise(ArgumentError, "A regular expression must be supplied as the :with option of the configuration hash") unless configuration[:with].is_a?(Regexp)
|
||||
|
@ -200,7 +200,7 @@ module ActiveRecord
|
|||
# ::in: An enumerable object of available items
|
||||
# ::message: Specifieds a customer error message (default is: "is not included in the list")
|
||||
def validates_inclusion_of(*attr_names)
|
||||
configuration = { :message => ActiveRecord::Errors.default_error_messagess[:inclusion], :on => :save }
|
||||
configuration = { :message => ActiveRecord::Errors.default_error_messages[:inclusion], :on => :save }
|
||||
configuration.update(attr_names.pop) if attr_names.last.is_a?(Hash)
|
||||
enum = configuration[:in]
|
||||
|
||||
|
@ -311,7 +311,7 @@ module ActiveRecord
|
|||
@base, @errors = base, {}
|
||||
end
|
||||
|
||||
@@default_error_messagess = {
|
||||
@@default_error_messages = {
|
||||
:inclusion => "is not included in the list",
|
||||
:invalid => "is invalid",
|
||||
:confirmation => "doesn't match confirmation",
|
||||
|
@ -321,7 +321,7 @@ module ActiveRecord
|
|||
:too_short => "is too short (min is %d characters)",
|
||||
:taken => "has already been taken",
|
||||
}
|
||||
cattr_accessor :default_error_messagess
|
||||
cattr_accessor :default_error_messages
|
||||
|
||||
|
||||
# Adds an error to the base object instead of any particular attribute. This is used
|
||||
|
@ -336,19 +336,19 @@ module ActiveRecord
|
|||
# for the same attribute and ensure that this error object returns false when asked if +empty?+. More than one
|
||||
# error can be added to the same +attribute+ in which case an array will be returned on a call to <tt>on(attribute)</tt>.
|
||||
# If no +msg+ is supplied, "invalid" is assumed.
|
||||
def add(attribute, msg = @@default_error_messagess[:invalid])
|
||||
def add(attribute, msg = @@default_error_messages[:invalid])
|
||||
@errors[attribute.to_s] = [] if @errors[attribute.to_s].nil?
|
||||
@errors[attribute.to_s] << msg
|
||||
end
|
||||
|
||||
# Will add an error message to each of the attributes in +attributes+ that is empty (defined by <tt>attribute_present?</tt>).
|
||||
def add_on_empty(attributes, msg = @@default_error_messagess[:empty])
|
||||
def add_on_empty(attributes, msg = @@default_error_messages[:empty])
|
||||
[attributes].flatten.each { |attr| add(attr, msg) unless @base.attribute_present?(attr.to_s) }
|
||||
end
|
||||
|
||||
# Will add an error message to each of the attributes in +attributes+ that has a length outside of the passed boundary +range+.
|
||||
# If the length is above the boundary, the too_long_msg message will be used. If below, the too_short_msg.
|
||||
def add_on_boundary_breaking(attributes, range, too_long_msg = @@default_error_messagess[:too_long], too_short_msg = @@default_error_messagess[:too_short])
|
||||
def add_on_boundary_breaking(attributes, range, too_long_msg = @@default_error_messages[:too_long], too_short_msg = @@default_error_messages[:too_short])
|
||||
for attr in [attributes].flatten
|
||||
add(attr, too_short_msg % range.begin) if @base.attribute_present?(attr.to_s) && @base.send(attr.to_s).length < range.begin
|
||||
add(attr, too_long_msg % range.end) if @base.attribute_present?(attr.to_s) && @base.send(attr.to_s).length > range.end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
require 'abstract_unit'
|
||||
require 'active_record/mixins/tree'
|
||||
require 'active_record/mixins/list'
|
||||
require 'active_record/acts/tree'
|
||||
require 'active_record/acts/list'
|
||||
require 'fixtures/mixin'
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue