1

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
4

1 回答 1

0

您的实体是 ActiveRecord 模型吗?如果是这样,也许MyModel.new(params)?或者更好的是,您只能允许这样声明的参数:MyModel.new(declared(params)). 请参阅此处的文档

Ruby 在元编程方面拥有强大的功能,可以让您自己做自己想做的事,而不那么痛苦,通过元编程之类的东西,您可以循环params并设置实体的字段。但是,您想要做的事情实际上很复杂,这就是为什么没有通用解决方案的原因。想象一下,如果您的实体中有深深嵌入的关联。我认为典型的建议是接受这样一个事实,即您通过 API 获得的(以及您回馈的)是事物的表示,而不是事物本身。在此之后,如果传入的内容已经代表一个现有的东西,也许那个东西可以用一个ID来表示?如果您的 API 需要一个 ID,那么您只需查找内容即可。这是在使用 Sidekiq 之类的东西时给出的建议:当您想稍后处理数据库中的某些数据时,您捕获数据库记录的 ID,而不是所有数据本身。这在数据同时发生变化等情况下具有优势,但这里的重点是,您可能会受益于让您的 API 接受指向您可以加载的内容的指针。

我会说你想要的最佳用例是当你的实体很复杂时,你说这就是你的情况。考虑让您的实体不那么复杂。


延伸一下:您可能想看一下grape-entity,尽管我认为这与您想要的相反,因为我认为(我自己没有使用过,并且文档不是很清楚我关于它的高级目的)它是为了与您的实体合作进行响应

于 2015-08-09T04:58:58.067 回答