首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在grape-entity gem中定义动态键?

如何在grape-entity gem中定义动态键?
EN

Stack Overflow用户
提问于 2017-11-06 09:16:33
回答 3查看 689关注 0票数 0

假设我有一个User模型,并且我通过Grape::Entity公开了User对象。所以在这里我想定义一个动态键,它的名称和值将基于其他键(idnameemail)的值。

代码语言:javascript
复制
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

我怎么能做到呢?提前感谢!

EN

回答 3

Stack Overflow用户

发布于 2017-11-06 12:53:37

您可以通过object访问该实例

代码语言:javascript
复制
def dynamic_key
  "#{object.id}_#{object.name}"
end

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

代码语言:javascript
复制
 expose "#{object.id}_#{object.name}".to_sym
票数 1
EN

Stack Overflow用户

发布于 2020-09-04 16:09:18

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

代码语言:javascript
复制
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' }将表示为:

代码语言:javascript
复制
{ id: 1, name: 'Foo', email: 'foo@bar.done', dynamic_key: '1_Foo' }
票数 0
EN

Stack Overflow用户

发布于 2021-06-15 20:46:47

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

代码语言:javascript
复制
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

结果是:

代码语言:javascript
复制
{
  "id": 1,
  "first_key": "first_key value",
  "second_key": "second_key value",
  "third_key": "third_key value"
}

或者对于只有一个基于id和name的动态密钥的简单情况

代码语言:javascript
复制
def details
  {"#{object.id}_#{object.title}": 'my dynamic value'}
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47128412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档