ruby-on-rails - 事件模型序列化器——自定义 JSON 响应

标签 ruby-on-rails json api rest active-model-serializers

这里有一个简单的问题。尝试搜索无果。

我正在努力为我当前的项目开发一个 RESTful API。我发现 Rails 绝对是这个目的的宠儿,所以请检查 Rails 的另一个标记!

但是,我在为/users 设计当前的 API 响应时遇到了障碍,该响应是一个应该返回 User 对象的 JSON 数组的方法:

我的用户模型:

class User < ActiveRecord::Base

  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable

  has_many :favorites
  has_many :reservations

  has_many :venues, through: :favorites
  has_many :venues, through: :reservations

  belongs_to  :gender
  belongs_to  :city
  belongs_to  :role
  has_one  :avatar

  has_many :payments
  has_one  :payment_history

  has_many :promotion_claims
  has_many :social_identifiers

end

我的路线:

Rails.application.routes.draw do

  namespace :api, defaults: { format: :json } do
    namespace :v1 do
      devise_for :users

      ..........................

      resources :roles
      resources :genders
      resources :cities

      #Users method
      get 'users', to: "users#index"

    end
  end

我的 Controller :

class API::V1::UsersController < API::V1::ApplicationController
  before_action :set_address, only: [:show, :edit, :update, :destroy]

  # GET /users
  # GET /users.json
  def index
    @users = User.all
    render json: @users
  end
end

我的序列化器:

class UserSerializer < ActiveModel::Serializer
  attributes :id, :first_name, :last_name, :cellphone, :email, :birthday, :username
  has_one :gender
  has_one :city
  has_one :role
end

class GenderSerializer < ActiveModel::Serializer
  attributes :name
end

class CitySerializer < ActiveModel::Serializer
  attributes :name
end

class RoleSerializer < ActiveModel::Serializer
  attributes :name
end

就我得到的 json 响应而言,这取得了相当令人满意的结果:

// GET http://localhost:3000/api/v1/users

[
  {
    "id": 1,
    "first_name": "Richmond",
    "last_name": "Huels",
    "cellphone": "29 8244 9100",
    "email": "coy.muller@medhurst.us",
    "birthday": "2011-02-23T19:24:00.151Z",
    "username": "alba.ortiz",
    "gender": {
      "name": "Male"
    },
    "city": {
      "name": "San Pedro Garza García"
    },
    "role": {
      "name": "admin"
    }
  },

但是,我希望 JSON 响应更像是:

// 20160225162402
// GET http://localhost:3000/api/v1/users

[
  {
    "id": 1,
    "first_name": "Richmond",
    "last_name": "Huels",
    "cellphone": "29 8244 9100",
    "email": "coy.muller@medhurst.us",
    "birthday": "2011-02-23T19:24:00.151Z",
    "username": "alba.ortiz",
    "gender": "Male",
    "city": "San Pedro Garza García",
    "role": "rp"
  },

我尝试重写 UserSerializer 中的属性方法,这样我就可以在返回 json 哈希之前对其执行任何我想要的操作,但它不起作用:

  #attributes override to get the right format for the response
  def attributes
    data = super
    data[:city] = data[:city][:name]
    data[:gender] = data[:gender][:name]
    data[:role] = data[:city][:name]
    data
  end

有什么方法可以实现我的 API 所需的功能吗?

感谢 ruby 爱好者,你们统治并继续令人惊叹!

最佳答案

我明白了:

我觉得这是一种黑客方法,因为基本上,我没有对与我的用户模型相关的模型使用序列化器,并且我覆盖了属性方法,但我所做的是删除了所有关系我的用户序列化程序然后我完全按照我之前编写的方式覆盖属性:

class UserSerializer < ActiveModel::Serializer
  attributes :id, :first_name, :last_name, :gender, :cellphone, :city, :email, :birthday, :username, :role

  def attributes
    data = super
    data[:gender] = data[:gender][:name]
    data[:city] = data[:city][:name]
    data[:role] = data[:role][:name]
    data
  end
end

这让我得到了我完美需要的 JSON 响应:

enter image description here

编辑:我找到了一个更好的方法:

我的序列化器:

class UserSerializer < ActiveModel::Serializer
  attributes :id, :first_name, :last_name, :gender, :cellphone, :city, :email, :birthday, :username, :role

  def gender
    return object.gender.name
  end

  def city
    return object.city.name
  end

  def role
    return object.role.name
  end

end

在我看来,更干净、更面向对象。

确保所有其他序列化程序都已就位,并且模型对其字段进行了正确的验证。

结果完全相同:

enter image description here

关于ruby-on-rails - 事件模型序列化器——自定义 JSON 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35639973/

相关文章:

Javascript JSON解析对象,一个对象属性未定义,不抛出任何错误

mysql - 无法访问 Rails 4.1 中的 SQL 列别名

ruby-on-rails - rails : default scoping being cached by query cache?

ios - 在 iOS 5 中刷新 JSON 表

python - 在python中将字典写入文件

rest - 带有 REST API 空回复的 OTRS Webservice curl

android - Google Assistant语音交互打开命令

javascript - Node JS 请求 promise POST 方法无法识别字符串

ruby-on-rails - 调用 ActiveRecord 的#relationship_ids = [1,2,3] 立即保存。有什么解决方法吗?

ruby-on-rails - rails 电子邮件预览/策略指令 : "style-src ' unsafe-inline'"