Rails: Довольно печатать JSON без излишеств

Я использую приведенный ниже код для отображения несанкционированного сообщения в JSON:

def render_unauthorized
  # Displays the Unauthorized message since the user did
  # not pass proper authentication parameters.
  self.headers['WWW-Authenticate'] = 'Token realm="API"'
  render json: { 
    error: { 
      type: "unauthorized",
      message: "This page cannot be accessed without a valid API key." 
      } 
    }, status: 401
end

Какие выходы:

{ "error": { "type": "unauthorized", "message": "Эта страница не может быть доступна без действительного ключа API." }}

Итак, мой вопрос таков: Есть ли способ распечатать это сообщение (БЕЗ размещения его в отдельном представлении и использовании какого-то стороннего драгоценного камня).

Изменить: что такое печатная версия?

Правильно разнесены, и хорошо.. симпатичный. Здесь вывод, который я хотел бы увидеть:

{
  "error": {
    "type": "unauthorized",
    "message": "This page cannot be accessed without a valid API key." 
  }
}

Решение

Использование ответа @emaillenin ниже работает. Для записи здесь, как выглядит последний код (поскольку он не включил все это):

def render_unauthorized
  # Displays the Unauthorized message since the user did
  # not pass proper authentication parameters.
  self.headers['WWW-Authenticate'] = 'Token realm="API"'
  render json: JSON.pretty_generate({ # <-- Here it is :')
    error: { 
      type: "unauthorized",
      message: "This page cannot be accessed without a valid API key." 
      } 
    }), status: 401
end

Ответы

Ответ 1

Используйте этот вспомогательный метод, встроенный в JSON.

JSON.pretty_generate

Я просто попробовал, и он работает:

> str = '{"error":{"type":"unauthorized","message":"This page cannot be accessed without a valid API key."}}'
> JSON.pretty_generate(JSON.parse(str))
 => "{\n  \"error\": {\n    \"type\": \"unauthorized\",\n    \"message\": \"This page cannot be accessed without a valid API key.\"\n  }\n}"

Ответ 2

Если вы (как я) обнаружите, что опция pretty_generate, встроенная в библиотеку Ruby JSON, недостаточно "хороша", я рекомендую использовать собственный NeatJSON gem для вашего форматирования.

Чтобы использовать его gem install neatjson, а затем используйте JSON.neat_generate вместо JSON.pretty_generate.

Как и Ruby pp, он будет хранить объекты и массивы на одной строке, когда они подходят, но при необходимости переносится на несколько. Например:

{
  "navigation.createroute.poi":[
    {"text":"Lay in a course to the Hilton","params":{"poi":"Hilton"}},
    {"text":"Take me to the airport","params":{"poi":"airport"}},
    {"text":"Let go to IHOP","params":{"poi":"IHOP"}},
    {"text":"Show me how to get to The Med","params":{"poi":"The Med"}},
    {"text":"Create a route to Arby's","params":{"poi":"Arby's"}},
    {
      "text":"Go to the Hilton by the Airport",
      "params":{"poi":"Hilton","location":"Airport"}
    },
    {
      "text":"Take me to the Fry in Fresno",
      "params":{"poi":"Fry's","location":"Fresno"}
    }
  ],
  "navigation.eta":[
    {"text":"When will we get there?"},
    {"text":"When will I arrive?"},
    {"text":"What time will I get to the destination?"},
    {"text":"What time will I reach the destination?"},
    {"text":"What time will it be when I arrive?"}
  ]
}

Он также поддерживает различные опции форматирования для дальнейшей настройки вашего вывода. Например, сколько пробелов до/после двоеточий? До/после запятых? Внутри скобок массивов и объектов? Вы хотите отсортировать ключи своего объекта? Вы хотите, чтобы все двоеточия были выстроены?

Использование параметра aligned позволит вашему выходу выглядеть следующим образом:

{
  "error": {
    "type"    : "unauthorized",
    "message" : "This page cannot be accessed without a valid API key." 
  }
}