Как добавить дополнительные атрибуты к ответу JSON в моем Rails API - PullRequest
0 голосов
/ 04 мая 2019

Я использую 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 во всех записях метода индекса в контроллере.

Как добавить параметры для индекса и показа каждой записи?

1 Ответ

1 голос
/ 04 мая 2019

Если вы хотите изменить JSON в HTTP-ответе, вам нужно найти место, где генерируется 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 .

В более сложном приложении вместо jbuilder ActiveModelSerializer может использоваться.

...