如何在Grape Entity中不使用using参数暴露嵌套Hash结构
问题原因
你当前的写法下,嵌套在expose :name块中的子字段,默认会从你传入的根数据源(也就是整个data对象)上查找firstname、lastname、nickname属性,而不是从name属性对应的子Hash中查找,自然找不到就返回nil。
解法1:无需嵌套定义,直接暴露name字段
如果不需要对name下的子字段做额外的格式化、权限过滤等逻辑,直接删除嵌套块即可,Grape::Entity会自动返回name对应的完整Hash:
class EmpEntity < Grape::Entity expose :id expose :age expose :name # 直接返回name属性的原始结构,不需要嵌套定义子字段 end
解法2:需要单独控制子字段时,使用proc指定取值逻辑
如果需要对name下的子字段做单独处理(比如重命名、格式化、权限判断),可以给每个子字段加proc,主动从根对象的name属性中取值:
class EmpEntity < Grape::Entity expose :id expose :age expose :name do expose :firstname, proc: ->(data) { data[:name][:firstname] } expose :lastname, proc: ->(data) { data[:name][:lastname] } expose :nickname, proc: ->(data) { data[:name][:nickname] } # 如果数据源是对象不是Hash,写法改为 data.name.firstname 即可 end end
两种写法都不需要新增额外的实体类,也不需要用到using参数,完全符合需求。
内容的提问来源于stack exchange,提问作者doraemon0711
相关产品推荐
相关产品推荐

