Визуализируйте шаблон Jbuilder и назначьте строку gon

Гон отлично работает с Jbuilder. В частности, документация говорит использовать его так

gon.jbuilder template: 'path/to/template.json.jbuilder'

Это хорошо работает, но я хотел бы кэшировать результат шаблона, поэтому нет необходимости повторно отображать шаблон. Следовательно, я использовал render_to_string, например:

gon.entities = Rails.cache.fetch('entities_json') do
  JSON.parse render_to_string(template: 'path/to/template.json.jbuilder')
end

Метод возвращает соответствующую строку, я должен передать ее через JSON.parse, иначе переменная gon хранит JSON-строку с двойным кодированием. Это раздражает, но я не знаю, как еще это решить.

К сожалению, этот вызов render_to_string приводит к тому, что вся HTML-страница отображается как строка. HTML завершен, переменные gon имеют ожидаемые значения, но внезапно страница больше не отображается как HTML в Chrome.

Есть идеи, как это решить?


person Mahoni    schedule 10.12.2013    source источник
comment
Мой ответ решил вашу проблему? Дайте мне знать, если это помогло. :)   -  person Gjaldon    schedule 15.12.2013
comment
@Gjaldon Мне нравится. У меня не было времени разобраться в этом. Я дам тебе награду достаточно рано.   -  person Mahoni    schedule 15.12.2013
comment
@Gjaldon Награда не тратится впустую по истечении времени, существует льготный период, в течение которого награда может быть потрачена, прежде чем она будет потрачена впустую или назначена автоматически.   -  person Mahoni    schedule 19.12.2013


Ответы (2)


Похоже, теперь вы можете легко выполнять кэширование фрагментов с помощью Jbuilder. Вот пример, который я нашел в исходниках jbuilder:

Пример:

json.cache! ['v1', @person], :expires_in => 10.minutes do |json|
  json.extract! @person, :name, :age
end

Применив это к вашему коду, мы сохраним следующий код в вашем контроллере:

gon.jbuilder template: 'path/to/template.json.jbuilder'

Затем внутри вашего представления jbuilder мы выполним кэширование фрагментов:

#path/to/template.json.jbuilder
json.cache! ['v1', @model], :expires_in => 10.minutes do |json|
  #your template.json.juilder code in here
end

Дайте мне знать, если это поможет!

person Gjaldon    schedule 14.12.2013

Есть некоторые проблемы с render_to_string изменением content_type для последующих рендеров. См.: https://github.com/rails/rails/issues/14173.

Некоторые возможные обходные пути

  • Явно установите content_type при вызове рендеринга, например. render content_type: text/html
  • Явно установите content_type для ответа после вызова render_to_string. Этот вариант может быть предпочтительнее, если вы помещаете render_to_string во вспомогательный метод контроллера и не хотите, чтобы кто-либо, вызывающий вспомогательный метод, знал об этой странности. например response.headers["Content-Type"] = request.format.to_s
person Ray J    schedule 10.11.2016