Ruby
grape-entity

grape-entityのexposeが入れ子している場合とusingを使用している場合のhashの渡し方法

概要

grape-entityで、exposeが入れ子している場合とusingを使用している場合のhashの渡し方が異なるのでまとめました。

exposeが入れ子している場合の渡し方

下記のUserEntityを例にhashの渡し方の失敗例と成功例を示します。

class UserEntity < Grape::Entity
  expose :name
  expose :address do
    expose :prefecture
  end
end

puts UserEntity.new({name: 'iwanaga', address: {prefecture: 'tokyo' }}).serializable_hash # 失敗例 {:name=>"iwanaga", :address=>{:prefecture=>nil}}
puts UserEntity.new({name: 'iwanaga', prefecture: 'tokyo'}).serializable_hash # 成功例 {:name=>"iwanaga", :address=>{:prefecture=>"tokyo"}}

ポイントは、exposeするキーをフラットなHashで渡すことです。

usingを使用している場合の渡し方

こちらもUserEntityを例に失敗例と成功例を示します。

class AddressEntity < Grape::Entity
  expose :prefecture
end

class UserEntity <  Grape::Entity
  expose :name
  expose :address, using: AddressEntity
end

puts UserEntity.new({name: 'iwanaga', prefecture: 'Tokyo'}).serializable_hash # 失敗例 {:name=>"iwanaga", :address=>nil}
puts UserEntity.new({name: 'iwanaga', address: {prefecture: 'tokyo' }}).serializable_hash # 成功例 {:name=>"iwanaga", :address=>{:prefecture=>"tokyo"}}

ポイントは、exposeするキーを入れ子で渡すことです。

バージョン

  • ruby 2.5.1p57
  • grape-entity 0.7.1