Применить псевдоним для цикла в объекте винограда
Я хотел бы получить следующий 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" } }
]