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

Я хотел бы получить следующий 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.

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


person Sam    schedule 04.04.2018    source источник


Ответы (1)


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

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

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" } }
]
person Pierre-Adrien    schedule 04.04.2018
comment
Можете ли вы увидеть мой обновленный вопрос? Я уже видел псевдоним. Но у цикла есть проблема с псевдонимом. Извините за редактирование - person Sam; 04.04.2018
comment
@Sam: я обновил свой ответ. Я позволяю вам проверить, правильно ли это отвечает на вашу проблему, я считаю, что да (я сам использовал это несколько раз) - person Pierre-Adrien; 04.04.2018