Активная модель сериализатор и скрепки разных размеров


У меня есть класс модели активов, и он имеет разные размеры, используя скрепку 3.5.2:

class AssetSerializer < ActiveModel::Serializer
  attributes :id, :asset # works fine
  # would like to output small but don't seem to be able to
  #attributes :id, :asset, :asset(:small) 
end

Это немного сбивает с толку, потому что скрепка использует имя class, а модель называется class (ОК действительно сбивает с толку). Я получаю следующую ошибку:

/Users/jt/repos/rails/app/serializers/asset_serializer.rb:2: syntax error, unexpected '(', expecting keyword_end
  attributes :id, :asset, :asset(:small)

Ему явно не нравится аргумент, переданный активу

3 3

3 ответа:

Вы можете просто добавить пользовательский атрибут внутри сериализатора

У них есть пример в документах https://github.com/rails-api/active_model_serializers#attributes

Вот что бы вы использовали в своем примере.

class AssetSerializer < ActiveModel::Serializer
  attributes :id, :asset, :asset_small

  def asset_small
    object.asset.url(:small)
  end
end

Я не уверен, что это работает, но попробуйте это: Или, возможно, поиграйте вокруг define_method, чтобы переопределить: asset.

class AssetSerializer < ActiveModel::Serializer
  attributes :id, :asset 

  self._attributes.each do |attribute, value|
    define_method(attribute) do
      object.read_attribute(attribute)
    end
  end
end

Просто написал методы в классе и назвал их like...

class Asset < ActiveRecord::Base
  ...
  def asset_small
    asset.url(:small)
  end

  def asset_original
    asset.url
  end
  ...
end

...

class AssetSerializer < ActiveModel::Serializer
  attributes :id, :asset_small, :asset_original
end

И это сработало отлично.