0

假设我有一个User模型,并且我正在User通过Grape::Entity. 所以在这里我想定义一个动态键,其名称及其值将基于其他键(、、、idnameemail

module API
  module Entities
    class User < Grape::Entity
      expose :id
      expose :name
      expose :email
      expose :dynamic_key # dynamic key name will be generated based on other keys(`id`, `name`, `email`) value

      private

      def dynamic_key
       #dynamic key value here based on other keys(`id`, `name`) value
      end
    end
  end
end

我怎么能做到?提前致谢!

4

3 回答 3

1

您可以通过以下方式访问实例object

def dynamic_key
  "#{object.id}_#{object.name}"
end

编辑:误解了这个问题。不要以为你可以通过这种方式获得动态密钥。你能做这样的事情吗:

 expose "#{object.id}_#{object.name}".to_sym
于 2017-11-06T04:53:36.890 回答
0

你为什么想做这个?如果你想要动态的东西,它应该是键映射到的——而不是键本身。API 的使用者应该能够依赖于与文档定义一致的键名,并且请记住,键的意义在于拥有一个可以始终引用并映射到动态值的名称。因此,如果您想dynamic_key使用动态生成的值公开某些属性,您可以这样做:

expose :id
expose :name
expose :email
expose :dynamic_key do |object, _options|
  "#{object.id}_#{object.name}"
end

哈希{ id: 1, name: 'Foo', email: 'foo@bar.done' }将表示为:

{ id: 1, name: 'Foo', email: 'foo@bar.done', dynamic_key: '1_Foo' }
于 2020-09-04T08:09:18.220 回答
0

如果有人正在寻找解决方案,这就是我所做的:

class Trucs < Grape::Entity
  expose :id

  # expose custom / dynamic fields
  expose :details, merge: true # merge true to avoid "details": {...} in response

  private

  def details
    details_list = {}
    list_of_fields = %w[first_key second_key third_key] # keys can be dynamically created, this is just a sample.
    list_of_fields.each do |field_name|
      details_list[field_name.to_sym] = "#{field_name} value" # OR object.send(field_name) OR anythig you need
    end
    return details_list
  end
end

结果是:

{
  "id": 1,
  "first_key": "first_key value",
  "second_key": "second_key value",
  "third_key": "third_key value"
}

或者对于只有一个基于 id 和 name 的动态键的简单案例

def details
  {"#{object.id}_#{object.title}": 'my dynamic value'}
end
于 2021-06-15T12:46:47.103 回答