mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
fix alias_attribute
will raise a syntax error if make an alias on a
column that named as a ruby keyword
This commit is contained in:
parent
d98bbdee14
commit
c140a27fc5
2 changed files with 26 additions and 4 deletions
|
@ -184,7 +184,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
|
||||
|
||||
|
@ -226,7 +226,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
|
||||
|
@ -285,7 +285,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
|
||||
|
@ -295,7 +295,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
|
||||
|
@ -148,6 +161,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