Подтвердить что ты не робот

Условные атрибуты в сериализаторах Active Model

Как визуализировать атрибут, только если какое-то условие истинно?

Например, я хочу показать атрибут User token для создания действия.

4b9b3361

Ответ 1

Вы также можете сделать это следующим образом:

class EntitySerializer < ActiveModel::Serializer
  attributes :id, :created_at, :updated_at
  attribute :conditional_attr, if: :condition?

  def condition?
    #condition code goes here
  end
end

Например:

class UserSerializer < ActiveModel::Serializer
  attributes :id, :username, :name, :email, :created_at, :updated_at
  attribute :auth_token, if: :auth_token?

  def created_at
    object.created_at.to_i
  end

  def updated_at
    object.updated_at.to_i
  end

  def auth_token?
    true if object.auth_token
  end
end

Подробнее см. .

Ответ 2

вы можете переопределить метод attributes, вот простой пример:

class Foo < ActiveModel::Serializer

  attributes :id

  def attributes(*args)
    hash = super
    hash[:last_name] = 'Bob' unless object.persisted?
    hash
  end

end

Ответ 3

Вы можете начать с установки условия для метода инициализации сериализатора. Это условие может быть передано из любого места в вашем коде, включенного в хэш-параметры, который "инициализирует" принимает в качестве второго аргумента:

class SomeCustomSerializer < ActiveModel::Serializer

  attributes :id, :attr1, :conditional_attr2, :conditional_attr2

  def initialize(object, options={})
    @condition = options[:condition].present? && options[:condition]
    super(object, options)
  end

  def attributes(*args)
    return super unless @condition  #get all the attributes
    attributes_to_remove = [:conditional_attr2, :conditional_attr2]
    filtered = super.except(*attributes_to_remove)
    filtered
  end
end

В этом случае attr1 всегда будет передан, а условные атрибуты будут скрыты, если условие истинно.

Вы получите результат этой пользовательской сериализации, где бы вы ни находились в вашем коде:

custom_serialized_object = SomeCustomSerializer.new(object_to_serialize, {:condition => true})

Надеюсь, это было полезно!

Ответ 4

Сериализатор параметры были объединены в сериализаторы ActiveModel и теперь доступны (начиная с 0.10).

Ответ 5

Переопределение - хорошая идея, но если вы используете super, атрибуты будут вычисляться до того, как вы удалите то, что хотите. Если это не имеет для вас значения, хорошо, но когда это произойдет, вы можете использовать его:

def attributes(options={})
  attributes =
    if options[:fields]
      self.class._attributes & options[:fields]
    else
      self.class._attributes.dup
    end

  attributes.delete_if {|attr| attr == :attribute_name } if condition

  attributes.each_with_object({}) do |name, hash|
    unless self.class._fragmented
      hash[name] = send(name)
    else
      hash[name] = self.class._fragmented.public_send(name)
    end
  end
end

ps: v0.10.0.rc3