Created
May 13, 2012 08:11
-
-
Save josevalim/2686886 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/activemodel/lib/active_model/attribute_methods.rb b/activemodel/lib/active_model/attribute_methods.rb | |
index 2457543..da55653 100644 | |
--- a/activemodel/lib/active_model/attribute_methods.rb | |
+++ b/activemodel/lib/active_model/attribute_methods.rb | |
@@ -196,7 +196,7 @@ module ActiveModel | |
attribute_method_matchers.each do |matcher| | |
matcher_new = matcher.method_name(new_name).to_s | |
matcher_old = matcher.method_name(old_name).to_s | |
- define_optimized_call self, matcher_new, matcher_old | |
+ define_proxy_call false, self, matcher_new, matcher_old | |
end | |
end | |
@@ -238,7 +238,7 @@ module ActiveModel | |
if respond_to?(generate_method, true) | |
send(generate_method, attr_name) | |
else | |
- define_optimized_call generated_attribute_methods, method_name, matcher.method_missing_target, attr_name.to_s | |
+ define_proxy_call true, generated_attribute_methods, method_name, matcher.method_missing_target, attr_name.to_s | |
end | |
end | |
end | |
@@ -293,7 +293,7 @@ module ActiveModel | |
# Define a method `name` in `mod` that dispatches to `send` | |
# using the given `extra` args. This fallbacks `define_method` | |
# and `send` if the given names cannot be compiled. | |
- def define_optimized_call(mod, name, send, *extra) #:nodoc: | |
+ def define_proxy_call(include_private, mod, name, send, *extra) #:nodoc: | |
if name =~ NAME_COMPILABLE_REGEXP | |
defn = "def #{name}(*args)" | |
else | |
@@ -303,7 +303,7 @@ module ActiveModel | |
extra = (extra.map(&:inspect) << "*args").join(", ") | |
if send =~ CALL_COMPILABLE_REGEXP | |
- target = "#{send}(#{extra})" | |
+ target = "#{"self." unless include_private}#{send}(#{extra})" | |
else | |
target = "send(:'#{send}', #{extra})" | |
end | |
diff --git a/activemodel/test/cases/attribute_methods_test.rb b/activemodel/test/cases/attribute_methods_test.rb | |
index 34298d3..0d34334 100644 | |
--- a/activemodel/test/cases/attribute_methods_test.rb | |
+++ b/activemodel/test/cases/attribute_methods_test.rb | |
@@ -76,6 +76,19 @@ private | |
end | |
end | |
+class ModelWithRubyKeywordNamedAttributes | |
+ include ActiveModel::AttributeMethods | |
+ | |
+ def attributes | |
+ { :begin => 'value of begin', :end => 'value of end' } | |
+ end | |
+ | |
+private | |
+ def attribute(name) | |
+ attributes[name.to_sym] | |
+ end | |
+end | |
+ | |
class ModelWithoutAttributesMethod | |
include ActiveModel::AttributeMethods | |
end | |
@@ -188,6 +201,15 @@ class AttributeMethodsTest < ActiveModel::TestCase | |
assert_raises(NoMethodError) { m.protected_method } | |
end | |
+ test '#alias_attribute works with attributes named as a ruby keyword' do | |
+ ModelWithRubyKeywordNamedAttributes.define_attribute_methods([:begin, :end]) | |
+ ModelWithRubyKeywordNamedAttributes.alias_attribute(:from, :begin) | |
+ ModelWithRubyKeywordNamedAttributes.alias_attribute(:to, :end) | |
+ | |
+ assert_equal "value of begin", ModelWithRubyKeywordNamedAttributes.new.from | |
+ assert_equal "value of end", ModelWithRubyKeywordNamedAttributes.new.to | |
+ end | |
+ | |
class ClassWithProtected | |
protected | |
def protected_method |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment