如何向我的 Rails API 中的 JSON 响应添加其他属性

How to add additional attributes to the JSON response in my Rails API

我正在为我的应用程序使用 Rails 5.2。

要求:

http://localhost:3000/reports

回复:

[
    {
        id: 1,
        name: "Ram",
        details: {
            path: "dev/daily_summary_20190503.csv",
            success_detail: "Report uploaded to S3"
        },
        status: "success"
    },
    {
        id: 2,
        name: "John",
        details: {
            path: "dev/daily_summary_20190504.csv",
            error_detail: "Error in uploading report. Refer log for details"
        },
        status: "failed"
    }
]

我想将 download_url 消息参数添加到未将参数添加到架构的每条记录。以下是我的预期输出,

预期输出:

[
    {
        id: 1,
        name: "Ram",
        details: {
            path: "dev/daily_summary_20190503.csv",
            success_detail: "Report uploaded to S3"
        },
        status: "success",
        download_url: "https://<S3_HOST>/dev/daily_summary_20190503.csv",
        message: "Report uploaded to S3"
    },
    {
        id: 2,
        name: "John",
        details: {
            error_detail: "Error in uploading report. Refer log for details"
        },
        status: "failed",
        message: "Error in uploading report. Refer log for details"
    }
]

我试过使用attr_accessor,但这并不能帮助我在控制器中索引方法的所有记录中显示download_url。

如何为每条记录添加索引和显示参数?

如果您想更改 HTTP 响应中的 JSON,您需要找到生成 JSON 的位置。追踪请求 URL:

  • 在命令行中使用 rails routes
  • 在输出中,找到您的 url /reports 并读取它映射到的控制器 + 操作
  • 打开控制器文件(大概是/app/controllers/reports_controller.rb)找到动作(大概是index
  • 看动作结束

如果你发现这样的 render 语句:

  respond_to do |format|
    format.html  # index.html.erb
    format.json  { render :json => @reports }
  end

您需要关注format.json之后的区块。在这个例子中你看到 显示的数据存储在 @reports 变量中。 研究操作以找出数据是如何创建的。数据是 然后使用模板 /app/views/reports/index.json.jbuilder 渲染。 继续阅读 jbuilder

在更复杂的应用程序中,可能会使用 ActiveModelSerializer 而不是 jbuilder。