Рельсы, Виноградная сущность. Выставить при условии
Я создал виноградную сущность:
class VehicleDetails < Grape::Entity
expose :id
expose :name
expose :type
expose :health, if: {type: 'basis'}
end
Я хочу разоблачить :health
если текущий :type
равно basis
, Я пытаюсь получить к нему доступ этим методом:
get :details do
present Basis.all, with: GameServer::Entities::VehicleDetails
end
Health
атрибут не отображается в моем созданном JSON. Я мог бы использовать expose :health, if: :health
, это тоже не работает. Что я делаю не так???
1 ответ
Вы немного не понимаете, что :type
делает в течение Grape::Entity
, Это не относится к классу, который подвергается, но опция, которую вы передаете вызов present
, Вероятно, он не подходит для ваших целей, если вы не всегда знаете класс объектов, которые вы отправляете present
(Я предполагаю, что это не всегда так, и у вас здесь есть некоторый полиморфизм).
Я думаю, вы просто хотите это:
class VehicleDetails < Grape::Entity
expose :id
expose :name
expose :type
expose :health
end
Grape::Entity
попробует свойство и изящно потерпит неудачу, если оно недоступно или выдает ошибку.
Если другие классы, которые вы хотите использовать, имеют health
свойство, но вы хотите скрыть эти значения, вы можете использовать блочную форму expose
:
class VehicleDetails < Grape::Entity
expose :id
expose :name
expose :type
expose( :health ) do |vehicle,opts|
vehicle.is_a?( Basis ) ? vehicle.health : nil
end
end
Или вы можете передать Рубин Proc
как условие:
class VehicleDetails < Grape::Entity
expose :id
expose :name
expose :type
expose :health, :if => Proc.new {|vehicle| vehicle.is_a?( Basis )}
end
Этот последний может быть лучше, если вы не хотите показывать существующие health
свойство вообще для классов, которые имеют его кроме Basis