我有两个rails控制器操作:
def show
@project = Project.find(params[:id])
render json: @project,
:only => [:id, :compilation_id],
:methods => :track_name,
:include => {
:user => { :only => [:id, :email] }
}
end
def list_users
render json: User.select(:id, :email)
end
我想在一个回复中呈现它们。这样做的最佳方法是什么?我尝试使用here描述的to_json
方法,但我读到该方法已被弃用,我也注意到它逃脱了似乎没必要的内容。任何帮助表示赞赏。
答案 0 :(得分:1)
对于需要json结构足够复杂以使to_json
看起来可读的情况,我建议使用 active_model_serializers gem。
然后,您可以定义两个序列化程序类:
class ProjectSerializer < ActiveModel::Serializer
attributes :id, :compilation_id
has_many :users
end
class UserSerializer < ActiveModel::Serializer
attributes :id, :email
end
然后在你的控制器中:
class ProjectsController < ApplicationController
def show
@project = Project.find(params[:id])
render json: @project, serializer: ProjectSerializer, status: 200
end
end
作为奖励曲目,您甚至可以cache the response!
答案 1 :(得分:0)
当然,解决方案非常简单:
project = Project.select(:id, :compilation_id, :user_id, :genre_id, :ordering).find(params[:id])
render json: { :project => project,
:users => User.select(:id, :email),
:genres => Genre.select(:id, :name),
:track_name => project.track_name
}