Подтвердить что ты не робот

Render: json => 'string here' Ожидаемый результат

Я сделал это тысячу раз, но мне все еще не нравится, как render :json обрабатывает строки.

Чтобы установить область, разрешите говорить о Rails 3

Вот как это происходит сейчас:

...
render :json => 'This is the string'
...

Вернется в браузер:

This is the string

Это фактически не действительный ответ JSON: S

В идеале это должно выглядеть так:

"This is the string"

Даже направляющие рельсов говорят:

Вам не нужно вызывать to_json на объекте, который вы хотите отобразить. Если вы используете опцию: json, рендер автоматически вызовет to_json для вас.

И вызов "This is the string".to_json фактически возвращает "\"This is the string\"", как ожидалось.

"This is the string".to_json #=> "\"This is the string\""

Неужели я так ошибаюсь?

4b9b3361

Ответ 1

Я согласен, что сначала это неожиданное поведение, но на самом деле это имеет смысл.

Рассмотрим, например, то, что вы ожидаете от этого:

output = {'foo' => 'bar'}.to_json
render :json => output

Несмотря на то, что to_json является излишним, вы ожидаете, что результатом будет {foo: "bar"}. Однако обратите внимание, что результат {'foo' => 'bar'}.to_json на самом деле является строкой. Таким образом, вышеуказанный блок кода эквивалентен:

render :json => '{foo: "bar"}'

Если render были для строк JSON-encode, переданных в :json, вы получили бы "{foo: \"bar\"}", что явно не ожидалось.

Итак, здесь сделка: render проверяет, является ли аргумент :json строкой. Если это так, предполагается, что это строка JSON, и вы уже запустили to_json и передаете строку. Если нет, он запускает to_json объекта.

Я думаю, что документация должна, вероятно, прояснить это, но там у вас это есть. Хотя на первый взгляд это не совсем интуитивно, я был бы удивлен, если бы он работал каким-либо другим способом.