Рельсы, Виноградная сущность. Выставить при условии

Я создал виноградную сущность:

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

Другие вопросы по тегам