【问题标题】:Render status and data JSON response with active model serializer使用活动模型序列化器呈现状态和数据 JSON 响应
【发布时间】:2014-10-22 07:40:12
【问题描述】:

我正在使用活动模型序列化器。

我想以 JSON 格式呈现“状态”和“数据”,例如

{"status":"success","data":[{"id":1,"content":xxx"}]}

我已经能够在我的 rails 控制器中使用以下代码生成“数据”:

@jobs = Job.all
render json: @jobs

如何同时呈现“状态”和“数据”?我试过这样做:

@jobs = Job.all
render :json => { :status => :success, :data => @jobs }

这无法识别我的 JobSerializer,因此呈现 JSON 输出,但不使用我的 JobSerializer 中指定的属性和关联。

我也试过了:

@jobs = Job.all
render :json => { :status => :success, :data => ActiveModel::ArraySerializer.new(@jobs, each_serializer: JobSerializer) }

这似乎有效,即使用我的 JobSerializer 中指定的正确属性呈现 JSON 响应,但无法识别或呈现我的 JobSerializer 中的关联(即 has_many 关联)

有没有我想念的简单方法来做到这一点?

【问题讨论】:

  • def send_data @jobs.each do |job| job.data job.status end render something, json: @jobs.as_json end 尝试定义此方法..希望这会有所帮助..
  • 抱歉,不确定这是为了达到什么目的?每项工作的 job.data 和 job.status 会做什么?

标签: ruby-on-rails json active-model-serializers


【解决方案1】:

你可以这样做:

render :json => {
    status: "success",
    data: ContentSerializer.new( contents ).attributes
}

【讨论】:

    【解决方案2】:

    试试这个

    @jobs = Job.all
    render json: @jobs, status: 200
    

    如果有上述效果,试试这个

    @jobs = Job.all
    render json: @jobs, status: 200, serializer: JobSerializer
    

    【讨论】:

      【解决方案3】:

      也许你可以尝试用这种方式渲染:

      @jobs = Job.all
      render :json => { :status => :success, :data => @jobs.to_json }
      

      更新:

      如果你想渲染和相关的对象,这应该是这样的:

      render :json => { :status => :success, :data => @jobs.to_json(:include => :users) }
      

      这里我假设job 模型有users

      【讨论】:

      • 不幸的是没有工作。呈现 JSON 响应,但无法识别 JobSerialize 中的属性或关联。
      • 是的,但这只是手动加载关联 - @jobs 仍然无法识别我已经在 J​​obSerializer 中指定的属性和关联。
      【解决方案4】:
      1. 将 attr_accessor 添加到您的模型类

        类作业 attr_accessor :状态

        结束

      2.然后将相同的属性添加到您的序列化程序中

       class JobSerializer < ActiveModel::Serializer
        attributes :id, :name, :address, :email,:status
        has_one :branch
       end
      

      3.Done 在你的控制器中添加这样的代码

      @job.status = '成功' 渲染 json:@job,状态:200

      【讨论】:

        【解决方案5】:

        @jobs = Job.all render :json => { :status => :success, :data => (ActiveModel::ArraySerializer.new(@jobs, each_serializer: JobSerializer))

        要使has_many 关联起作用,需要在模型和序列化程序中定义关联

        class JobSerializer &lt; ActiveModel::Serializer
               has_many :association
        end

        class Section &lt; ApplicationRecord
               has_many :association
        end

        【讨论】:

          猜你喜欢
          • 2019-05-16
          • 2018-09-01
          • 2015-08-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多