【问题标题】:Serialize payload into a grape entity on post/put在 post/put 上将有效负载序列化为葡萄实体
【发布时间】:2014-11-13 05:07:51
【问题描述】:

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

【问题讨论】:

  • 作为推论,我怎样才能使实体上的属性只有允许的参数

标签: ruby-on-rails grape-api grape-entity


【解决方案1】:

您的实体是 ActiveRecord 模型吗?如果是这样,也许MyModel.new(params)?或者更好的是,您只能允许这样声明的参数:MyModel.new(declared(params))。见the doc here

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

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


顺便说一句:您可能想看看grape-entity,尽管我认为这与您想要的有点相反,因为我认为(我自己没有使用过它,文档也不是我非常清楚它的高级目的)它是为了与您的实体合作以实现响应

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多