使用 Rails 和 JSON API 的参数更简洁

Cleaner way to have params with Rails and JSON API

我有一个 Ember 客户端应用程序和 Rails 服务器端应用程序。我决定使用 json-api 因为我认为它是两者的标准。当我保存模型时,Ember 发送这种数据:

{ "data" =>
  { "relationships" =>
    { "users" =>
      { "data" =>
        [ { "type" => "users", "id" => "2" } ]
      }
    },
    "type" => "trails"
  },
  "controller" => "api/v1/trails",
  "action" => "create"
}

在我的控制器中,我有这个方法:

  def create
    render json: Trail.create(trail_params)
  end

我显然可以做一个方法 trail_params 来改变参数和 return ActiveRecord 使用的格式,但我想知道他们是否是更好的方法。

我使用 ActiveModelSerializer,但没有看到内置解决方案。

我的问题:我不喜欢这样的事实,因为我必须做一个解析器来反序列化参数并使 {users: [2]} 成为 ActiveRecord 想要的。

最佳做法是什么?

您在此处发布的数据格式由Ember的序列化层决定。您使用 json-api。该格式虽然不适合 Active Record。所以 json-api 不是两者的标准。我使用了 Ember 的层 Ember Data:它与 AR 一起完美地开箱即用

也许有点晚了,但是...

您说得对,JSON API 支持尚未内置到 Rails' AMS 中。但是,有一些 Ruby 库可以让在 ActiveRecord 之上构建 JSON API 兼容的 API 变得非常容易。也许最好的是 JSONAPI::Resources, but there's also Oat and, very soon 一个不同的 AMS 库。

我的问题将由 this pull request 解决。它接受 JSON api 格式并将其转换为 ActiveRecord 的格式。

另一种选择是使用 jsonapi-utils gem,它提供了一种简单的方法来呈现符合 JSON API 的响应:

你会这样写:

class API::UsersController < API::BaseController
  def index
    jsonapi_render json: User.all
  end
end

您将在其官方文档中找到更多示例。希望对你有帮助。