【问题标题】:How do I return nested models as JSON in Rails如何在 Rails 中将嵌套模型返回为 JSON
【发布时间】:2014-09-14 13:25:39
【问题描述】:
class User < ActiveRecord::Base
  has_many :images
end
class Image < ActiveRecord::Base
  has_many :sub_images
  belongs_to :user
end
class SubImage < ActiveRecord::Base
  belongs_to :image
end

路线

/users/:user_id
/users/:user_id/images/:image_id
/users/:user_id/images/:image_id/subimages/:subimage_id

resources :users do
  resources :images, :controller => "Images" do
    resources :subimages, :controller => "SubImages" do
    end
  end
end

目标:当我向用户 1 发出请求时,它应该返回所有用户 1 图像和嵌套的子图像。

目前,代码仅返回用户 1 的图像。我也希望它返回子图像。

【问题讨论】:

    标签: ruby-on-rails json rest


    【解决方案1】:

    通过 Rails API 使用 ActiveModel Serializers。您需要为模型创建序列化程序类并在 JSON 输出中指定所需的属性。

    您可以为现有模型生成序列化程序:

    rails g serializer post
    

    给定一个帖子和评论模型:

    class PostSerializer < ActiveModel::Serializer
      attributes :title, :body
    
      has_many :comments
    
      url :post
    end
    

    class CommentSerializer < ActiveModel::Serializer
      attributes :name, :body
    
      belongs_to :post_id
    
      url [:post, :comment]
    end
    

    默认情况下,当你序列化一个帖子时,你也会得到它的评论。

    现在,在您的控制器中,当您使用 render :json 时,Rails 现在将首先搜索对象的序列化程序并在可用时使用它。

    class PostsController < ApplicationController
      def show
        @post = Post.find(params[:id])
    
        render json: @post
      end
    end
    

    在这种情况下,Rails 会查找名为 PostSerializer 的序列化器,如果存在,则使用它来序列化 Post。

    【讨论】:

    • 如果我想有条件地使用序列化器怎么办?默认情况下不是。
    • @erielmarimon 在调用控制器中添加条件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2015-07-10
    • 2023-03-13
    • 1970-01-01
    • 2011-10-06
    • 2018-11-04
    • 2021-02-27
    相关资源
    最近更新 更多