Grape&是否有办法Grape-Entity自动将数据序列化为实体?似乎所有示例都使用params [:var](来自:https://github.com/intridea/grape)
desc "Create a status."
params do
requires :status, type: String, desc: "Your status."
end
post do
authenticate!
Status.create!({
user: current_user,
text: params[:status]
})
end
当发布的实体更复杂时(假设一个新人(名字,姓氏,地址等),有没有办法让它自动变成API代表的实体?寻找某种用法,比如这样:
post do
authenticate!
entity.first_name
entity.last_name
end
答案 0 :(得分:0)
您的实体是ActiveRecord模型吗?如果是这样,也许MyModel.new(params)
?或者更好的是,您只能允许声明的参数:MyModel.new(declared(params))
。请参阅the doc here。
Ruby拥有大量的元编程功能,可以让你自己做你想要的事情,不那么痛苦,可以使用元编程之类的东西来循环params
并设置实体的字段。 然而,您想要做的事实上很复杂,这就是为什么没有通用的解决方案。想象一下,如果您的实体中存在深层次的关联。我认为典型的建议是接受这样一个事实:你通过API给出的东西(以及你给出的东西)是一个事物的代表,而不是事物本身。在此之后,如果传入的内容已经代表现有的事物,那么这个东西可能由一个ID表示?如果您的API采用了ID,那么您只需看一下即可。这是在使用Sidekiq之类的东西时给出的建议:当你想在以后处理数据库中的某些数据时,你会捕获数据库记录的ID,而不是所有数据本身。这在数据同时发生变化等情况下具有优势,但这里的重点是,您可以从API接受指向可以加载的内容的指针中受益。
我会说你想要的最好的用例是你的实体很复杂,你说的就是你的情况。考虑让您的实体不那么复杂。
作为一个延伸:你可能想看看grape-entity,虽然我认为它与你想要的相反,因为我认为(我自己没有使用它,文档也没有我非常清楚它的高级用途)它适用于与您的实体合作进行响应。