mirror of
https://github.com/github/rails.git
synced 2026-01-29 16:28:09 -05:00
alias_method_chain preserves method punctuation so foo, foo?, and foo! may be chained with the same feature.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4482 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
@@ -218,7 +218,7 @@ module ActiveRecord
|
||||
base.extend ClassMethods
|
||||
base.class_eval do
|
||||
alias_method_chain :save, :validation
|
||||
alias_method_chain :save!, :validation!
|
||||
alias_method_chain :save!, :validation
|
||||
alias_method_chain :update_attribute, :validation_skipping
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
*SVN*
|
||||
|
||||
* alias_method_chain preserves method punctuation so foo, foo?, and foo! may be chained with the same feature. [Jeremy Kemper]
|
||||
Example:
|
||||
alias_method_chain :save!, :validation
|
||||
is equivalent to
|
||||
alias_method :save_without_validation!, :save!
|
||||
alias_method :save!, :save_with_validation!
|
||||
|
||||
* Enhance Symbol#to_proc so it works with list objects, such as multi-dimensional arrays. Closes #5295 [nov@yo.rim.or.jp]. Example:
|
||||
|
||||
{1 => "one", 2 => "two", 3 => "three"}.sort_by(&:first).map(&:last)
|
||||
|
||||
@@ -9,11 +9,22 @@ class Module
|
||||
# alias_method_chain :foo, :feature
|
||||
#
|
||||
# And both aliases are set up for you.
|
||||
#
|
||||
# Query and bang methods (foo?, foo!) keep the same punctuation:
|
||||
#
|
||||
# alias_method_chain :foo?, :feature
|
||||
#
|
||||
# is equivalent to
|
||||
#
|
||||
# alias_method :foo_without_feature?, :foo?
|
||||
# alias_method :foo?, :foo_without_feature?
|
||||
#
|
||||
# so you can safely chain foo, foo?, and foo! with the same feature.
|
||||
def alias_method_chain(target, feature)
|
||||
# Strip out punctuation on predicates or bang methods since
|
||||
# e.g. target?_without_feature is not a valid method name.
|
||||
aliased_target = target.to_s.sub(/[?!]/, '')
|
||||
alias_method "#{aliased_target}_without_#{feature}", target
|
||||
alias_method target, "#{aliased_target}_with_#{feature}"
|
||||
aliased_target, punctuation = target.to_s.sub(/([?!])$/, ''), $1
|
||||
alias_method "#{aliased_target}_without_#{feature}#{punctuation}", target
|
||||
alias_method target, "#{aliased_target}_with_#{feature}#{punctuation}"
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user