0

我希望得到带有 name 和 note 字段的 json。但我只得到注释字段。我究竟做错了什么?

class OrderPage
  module Entities
    class AsSeller < OrderPage::Entities::Order
      expose :note

      def note
        object.note
      end
    end
  end
end

class OrderPage
  module Entities
    class Order < Grape::Entity
       expose :name
    end
  end
end

 json = OrderPage::Entities::AsSeller.represent(order).as_json
4

2 回答 2

0

实际上,在您的情况下,您应该在第三行收到错误

uninitialized constant OrderPage::Entities::Order

但是改变顺序,使class Order定义高于class AsSeller——一切看起来都不错,JSON 是用两个字段呈现的。

如果这没有帮助,您还可以尝试更新 gem 版本。

于 2020-07-08T09:59:54.837 回答
0

我认为你应该退后一步,记住一个实体应该代表一个对象,因为它看起来并不像你在这里所做的那样。所以你应该有一个实体来代表你的代码库的 Order 对象概念(AsSeller 听起来像是一种可见性限制,而不是一个对象),并with_options用来限制什么是公开的或不公开的。

module Entities
  class Order < Grape::Entity
    expose :name

    with_options(if: { visibility: :seller }) do
      expose :note
    end
  end
end

order = { name: 'Relax', note: "Don't do it" }

# Standard order representation
Entities::Order.represent(order).serializable_hash
=> {:name=>"Relax"}

# Order represented with visibility: :seller
Entities::Order.represent(order, visibility: :seller).serializable_hash
=> {:name=>"Relax", :note=>"Don't do it"}

或者,如果只是有条件地公开仅存在于订单模型的某些后代上的属性,您应该能够执行以下操作:

expose :note, if: ->(order, _) { order.respond_to?(:note) }

如果您确实需要包含在其他地方定义的属性子集,您可以编写一个关注并将其包含在另一个实体中,但从我在您的问题中可用的上下文和您使用的命名来看,似乎不是这样这里是一个很好的解决方案。

于 2020-09-04T08:37:35.233 回答