Spec-Zone.ru › Ruby on Rails 4.2

модуль 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"}

Должен быть определён attributes хэш, содержащий все атрибуты, которые необходимо сериализовать. Атрибуты должны быть строками, а не символами. При вызове сериализуемый хэш будет использовать методы экземпляра, соответствующие именам ключей хэша атрибутов. Чтобы переопределить это поведение, обратитесь к приватному методу 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' }})

Публичные методы экземпляра

serializable_hash(options = nil) Показать исходный код
# 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

Возвращает сериализованный хэш вашего объекта.

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"}

© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API