Ruby on rails 活动模型序列化程序——定制JSON响应
这里有个简单的问题。我试着搜索,但没有结果 我正在为我当前的项目准备一个RESTful API。我发现Rails在这方面绝对是一个宠儿,所以请检查Rails令人敬畏的另一个标记 然而,我在为/users设计当前API响应时遇到了一个障碍,该响应是一个应该返回用户对象的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
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