提交 56417b40 编写于 作者: J José Valim

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

add `self.` to allow method name using ruby keyword
......@@ -196,7 +196,7 @@ def alias_attribute(new_name, old_name)
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 @@ def define_attribute_method(attr_name)
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 @@ def attribute_method_matcher(method_name) #:nodoc:
# 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 @@ def define_optimized_call(mod, name, send, *extra) #:nodoc:
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
......
......@@ -76,6 +76,19 @@ def attribute(name)
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 @@ def foo
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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册