mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
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:
commit
56417b4092
2 changed files with 26 additions and 4 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue