如何在葡萄实体中公开哈希而不使用`using`
How to expose Hash in Grape Entity and not use `using`
我有这个实体。
class EmpEntity < Grape::Entity
expose :id
expose :age
expose :name do
expose :firstname
expose :lastname
expose :nickname
end
end
我得到这样的结果。
data = {
id: 1,
age: 18,
name: {
firstname: 'foo',
lastname: 'bar',
nickname: 'foobar',
},
}
当我使用实体的方法时,它return这个。
EmpEntity.represent(data)
# => #<EmpEntity:15940 id=1 age=18 name={:firstname=>nil, :lastname=>nil, :nickname=>nil}>
如何得到这样的结果。
# => #<EmpEntity:15940 id=1 age=18 name={:firstname=>'foo', :lastname=>'bar', :nickname=>'foobar'}>
并且不要使用实体的 using
选项。
因为我的应用的结果不是合适的新实体。
我认为 firstname
和 lastname
是 nil
因为您的实体不知道如何从哈希中获取它们,您可以添加一个 lambda 来检查表示的实例是否是一个散列或不决定你如何 return value
class EmpEntity < Grape::Entity
expose :id
expose :age
expose :name do
expose :firstname, proc: lambda {|instance, options|
if instance.is_a? Hash
instance[:name][:firstname]
else
instance.firstname
end
}
expose :lastname, proc: lambda {|instance, options|
# same as above
}
expose :nickname, proc: lambda {|instance, options|
# same as aboce
}
end
end
更新
普通版
class HashEntity < Grape::Entity
class << self
def hash_keys
@hash_keys ||= []
end
def expose_hash(key)
hash_keys << key
if block_given?
expose key do
yield
end
else
keys = hash_keys.dup
expose key, proc: lambda { |instance, _|
instance.dig(*keys)
}
end
hash_keys.pop
end
end
end
演示
class InfoEntity < HashEntity
expose :id
expose_hash :name do
expose_hash :first_name
expose_hash :last_name
end
end
我有这个实体。
class EmpEntity < Grape::Entity
expose :id
expose :age
expose :name do
expose :firstname
expose :lastname
expose :nickname
end
end
我得到这样的结果。
data = {
id: 1,
age: 18,
name: {
firstname: 'foo',
lastname: 'bar',
nickname: 'foobar',
},
}
当我使用实体的方法时,它return这个。
EmpEntity.represent(data)
# => #<EmpEntity:15940 id=1 age=18 name={:firstname=>nil, :lastname=>nil, :nickname=>nil}>
如何得到这样的结果。
# => #<EmpEntity:15940 id=1 age=18 name={:firstname=>'foo', :lastname=>'bar', :nickname=>'foobar'}>
并且不要使用实体的 using
选项。
因为我的应用的结果不是合适的新实体。
我认为 firstname
和 lastname
是 nil
因为您的实体不知道如何从哈希中获取它们,您可以添加一个 lambda 来检查表示的实例是否是一个散列或不决定你如何 return value
class EmpEntity < Grape::Entity
expose :id
expose :age
expose :name do
expose :firstname, proc: lambda {|instance, options|
if instance.is_a? Hash
instance[:name][:firstname]
else
instance.firstname
end
}
expose :lastname, proc: lambda {|instance, options|
# same as above
}
expose :nickname, proc: lambda {|instance, options|
# same as aboce
}
end
end
更新 普通版
class HashEntity < Grape::Entity
class << self
def hash_keys
@hash_keys ||= []
end
def expose_hash(key)
hash_keys << key
if block_given?
expose key do
yield
end
else
keys = hash_keys.dup
expose key, proc: lambda { |instance, _|
instance.dig(*keys)
}
end
hash_keys.pop
end
end
end
演示
class InfoEntity < HashEntity
expose :id
expose_hash :name do
expose_hash :first_name
expose_hash :last_name
end
end