Merge pull request #4785 from ayamomiji/add-self-to-allow-method-name-using-ruby-keyword

add `self.` to allow method name using ruby keyword
This commit is contained in:
José Valim 2012-05-25 00:29:07 -07:00
commit 56417b4092
2 changed files with 26 additions and 4 deletions

View File

@ -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

View File

@ -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
@ -155,6 +168,15 @@ class AttributeMethodsTest < ActiveModel::TestCase
assert_equal "value of foo bar", ModelWithAttributesWithSpaces.new.foo_bar
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
test '#undefine_attribute_methods removes attribute methods' do
ModelWithAttributes.define_attribute_methods(:foo)
ModelWithAttributes.undefine_attribute_methods