модуль ActiveModel::Serialization
Сериализация Active Model
Обеспечивает базовую сериализацию в #serializable_hash для вашего объекта.
Минимальная реализация может быть такой:
class Person
include ActiveModel::Serialization
attr_accessor :name
def attributes
{'name' => nil}
end
end
Что даст вам:
person = Person.new
person.serializable_hash # => {"name"=>nil}
person.name = "Bob"
person.serializable_hash # => {"name"=>"Bob"}
Вам необходимо объявить хэш атрибутов, содержащий атрибуты, которые вы хотите сериализовать. Атрибуты должны быть строками, а не символами. При вызове, хэш сериализации будет использовать методы экземпляра, соответствующие ключам хэша атрибутов. Чтобы переопределить это поведение, ознакомьтесь с частным методом read_attribute_for_serialization.
Однако, чаще всего вы захотите включить сериализации JSON или XML. Оба этих модуля автоматически включают модуль ActiveModel::Serialization, поэтому нет необходимости явно его включать.
Минимальная реализация, включающая XML и JSON, будет такой:
class Person
include ActiveModel::Serializers::JSON
include ActiveModel::Serializers::Xml
attr_accessor :name
def attributes
{'name' => nil}
end
end
Что даст вам:
person = Person.new
person.serializable_hash # => {"name"=>nil}
person.as_json # => {"name"=>nil}
person.to_json # => "{\"name\":null}"
person.to_xml # => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<serial-person...
person.name = "Bob"
person.serializable_hash # => {"name"=>"Bob"}
person.as_json # => {"name"=>"Bob"}
person.to_json # => "{\"name\":\"Bob\"}"
person.to_xml # => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<serial-person...
Допустимые варианты — :only, :except, :methods и :include. Ниже приведены все допустимые примеры:
person.serializable_hash(only: 'name')
person.serializable_hash(include: :address)
person.serializable_hash(include: { address: { only: 'city' }})
Публичные методы экземпляра
Возвращает сериализованный хэш вашего объекта.
class Person
include ActiveModel::Serialization
attr_accessor :name, :age
def attributes
{'name' => nil, 'age' => nil}
end
def capitalized_name
name.capitalize
end
end
person = Person.new
person.name = 'bob'
person.age = 22
person.serializable_hash # => {"name"=>"bob", "age"=>22}
person.serializable_hash(only: :name) # => {"name"=>"bob"}
person.serializable_hash(except: :name) # => {"age"=>22}
person.serializable_hash(methods: :capitalized_name)
# => {"name"=>"bob", "age"=>22, "capitalized_name"=>"Bob"}
# File activemodel/lib/active_model/serialization.rb, line 97
def serializable_hash(options = nil)
options ||= {}
attribute_names = attributes.keys
if only = options[:only]
attribute_names &= Array(only).map(&:to_s)
elsif except = options[:except]
attribute_names -= Array(except).map(&:to_s)
end
hash = {}
attribute_names.each { |n| hash[n] = read_attribute_for_serialization(n) }
Array(options[:methods]).each { |m| hash[m.to_s] = send(m) if respond_to?(m) }
serializable_add_includes(options) do |association, records, opts|
hash[association.to_s] = if records.respond_to?(:to_ary)
records.to_ary.map { |a| a.serializable_hash(opts) }
else
records.serializable_hash(opts)
end
end
hash
end
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.