Merge pull request #209 from ismaelga/attributes_with_keys

Able to specify keys on the attributes method
This commit is contained in:
Steve Klabnik
2013-03-05 14:29:28 -08:00
3 changed files with 44 additions and 1 deletions

View File

@@ -69,12 +69,17 @@ module ActiveModel
class << self class << self
# Define attributes to be used in the serialization. # Define attributes to be used in the serialization.
def attributes(*attrs) def attributes(*attrs)
self._attributes = _attributes.dup self._attributes = _attributes.dup
attrs.each do |attr| attrs.each do |attr|
if Hash === attr
attr.each {|attr_real, key| attribute attr_real, :key => key }
else
attribute attr attribute attr
end end
end end
end
def attribute(attr, options={}) def attribute(attr, options={})
self._attributes = _attributes.merge(attr => options[:key] || attr.to_s.gsub(/\?$/, '').to_sym) self._attributes = _attributes.merge(attr => options[:key] || attr.to_s.gsub(/\?$/, '').to_sym)

View File

@@ -29,6 +29,28 @@ class SerializerTest < ActiveModel::TestCase
}, hash) }, hash)
end end
def test_attributes_method_specifying_keys
user = User.new
user_serializer = UserAttributesWithKeySerializer.new(user, :scope => {})
hash = user_serializer.as_json
assert_equal({
:user_attributes_with_key => { :f_name => "Jose", :l_name => "Valim", :ok => true }
}, hash)
end
def test_attributes_method_specifying_some_keys
user = User.new
user_serializer = UserAttributesWithSomeKeySerializer.new(user, :scope => {})
hash = user_serializer.as_json
assert_equal({
:user_attributes_with_some_key => { :first_name => "Jose", :l_name => "Valim", :ok => true }
}, hash)
end
def test_attribute_method_with_name_as_serializer_prefix def test_attribute_method_with_name_as_serializer_prefix
object = SomeObject.new("something") object = SomeObject.new("something")
object_serializer = SomeSerializer.new(object, {}) object_serializer = SomeSerializer.new(object, {})

View File

@@ -54,6 +54,22 @@ class UserSerializer < ActiveModel::Serializer
end end
end end
class UserAttributesWithKeySerializer < ActiveModel::Serializer
attributes :first_name => :f_name, :last_name => :l_name
def serializable_hash
attributes.merge(:ok => true).merge(options[:scope])
end
end
class UserAttributesWithSomeKeySerializer < ActiveModel::Serializer
attributes :first_name, :last_name => :l_name
def serializable_hash
attributes.merge(:ok => true).merge(options[:scope])
end
end
class DefaultUserSerializer < ActiveModel::Serializer class DefaultUserSerializer < ActiveModel::Serializer
attributes :first_name, :last_name attributes :first_name, :last_name
end end