Применить псевдоним для цикла в объекте винограда

Я хотел бы получить следующий JSON.

[{"Product":{"CountryName":4848, }},{"Product":{"CountryName":700}]


module API
  module Entities
    class Example < Grape::Entity
      expose(:product) do
        expose(:country_name) do |product, options|
          product.country.name
        end
      end
    end
  end
end

Параметры продукта и имя. Я хотел бы вернуть Product, ProductName.

Как применить псевдоним для зацикливания элементов в рамках структуры винограда?

1 ответ

Решение
  • Product атрибут: используйте 'Product' строка вместо :product условное обозначение,
  • CountryName атрибут: вам нужно создать метод в вашей сущности, который будет возвращать product.country.name и разоблачить это в вашей сущности. А затем используйте псевдоним, чтобы ключ был CountryName как и ожидалось (вы можете увидеть документацию по псевдонимам, если это необходимо).

В вашем случае это даст:

module API
  module Entities
    class Product < Grape::Entity
      expose 'Product' do
        # You expose the result of the country_name method, 
        # and use an alias to customise the attribute name
        expose :country_name, as: 'CountryName'
      end

      private

      # Method names are generally snake_case in ruby, so it feels
      # more natural to use a snake_case method name and alias it
      def country_name
        object.country.name
      end
    end
  end
end

И в своей конечной точке вы указываете сущность, которая должна использоваться для сериализации экземпляров Продуктов. В моем примере вы, возможно, заметили, что я позволил себе переименовать объект в Productчто даст нам в конечном итоге:

# /products endpoint
resources :products do
  get '/' do
    present Product.all, with: API::Entities::Product
  end
end

Что должно дать вам такой результат, как и ожидалось:

[
    { "Product": { "CountryName": "test 1" } },
    { "Product": { "CountryName": "test 2" } }
]
Другие вопросы по тегам