Ruby on rails 活动模型序列化程序——定制JSON响应

Ruby on rails 活动模型序列化程序——定制JSON响应,ruby-on-rails,json,api,rest,active-model-serializers,Ruby On Rails,Json,Api,Rest,Active Model Serializers,这里有个简单的问题。我试着搜索,但没有结果 我正在为我当前的项目准备一个RESTful API。我发现Rails在这方面绝对是一个宠儿,所以请检查Rails令人敬畏的另一个标记 然而,我在为/users设计当前API响应时遇到了一个障碍,该响应是一个应该返回用户对象的JSON数组的方法: 我的用户模型: class User < ActiveRecord::Base devise :database_authenticatable, :registerable, :recoverab

这里有个简单的问题。我试着搜索,但没有结果

我正在为我当前的项目准备一个RESTful API。我发现Rails在这方面绝对是一个宠儿,所以请检查Rails令人敬畏的另一个标记

然而,我在为/users设计当前API响应时遇到了一个障碍,该响应是一个应该返回用户对象的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
我的控制器:

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
但是,我希望我的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中的attributes方法,并将其设置为可以在返回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所需的功能吗


谢谢你们红宝石爱好者,你们统治并保持着惊人的成就

如果要将结果合并到单个哈希中

例如,您可以使用展平方法

s = [ 1, 2, 3 ]           #=> [1, 2, 3]
t = [ 4, 5, 6, [7, 8] ]   #=> [4, 5, 6, [7, 8]]
a = [ s, t, 9, 10 ]       #=> [[1, 2, 3], [4, 5, 6, [7, 8]], 9, 10]
a.flatten                 #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
在您的情况下,在获得所有结果并将其传递给变量“data”之后

我想出来了:

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

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
class UserSerializer
这让我得到了我所需要的JSON响应:

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

我的序列化程序:

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
class UserSerializer
在我看来,更干净、更面向对象

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

结果完全相同:


谢谢。我不确定我是否同意Rails是天赐之物,有时候它太声明了,但它很好。
s = [ 1, 2, 3 ]           #=> [1, 2, 3]
t = [ 4, 5, 6, [7, 8] ]   #=> [4, 5, 6, [7, 8]]
a = [ s, t, 9, 10 ]       #=> [[1, 2, 3], [4, 5, 6, [7, 8]], 9, 10]
a.flatten                 #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
data.flatten
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
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