呈现Jbuilder模板并将字符串分配给gon

时间:2013-12-10 20:56:46

标签: javascript ruby-on-rails ruby json 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变量具有预期值,但突然之间,页面在Chrome中不再显示为HTML。

知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

看起来您现在可以使用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

让我知道它是否有帮助!

答案 1 :(得分:0)

render_to_string更改后续呈现的content_type存在一些问题。请参阅:https://github.com/rails/rails/issues/14173

一些可能的解决方法是

  • 在调用render时显式设置content_type,例如render content_type: text/html
  • 在调用content_type后明确设置响应的render_to_string。如果您将render_to_string置于控制器帮助程序方法中,并且不希望要求任何调用帮助程序方法的人知道这种怪异,则可以选择此选项。例如response.headers["Content-Type"] = request.format.to_s