1
0
Fork 0
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:
ayaya 2012-01-31 18:43:54 +08:00
parent d98bbdee14
commit c140a27fc5
2 changed files with 26 additions and 4 deletions

View file

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

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