【问题标题】:Render a Jbuilder template and assign the string to gon渲染一个 Jbuilder 模板并将字符串分配给 gon
【发布时间】:2013-12-10 20:56:45
【问题描述】:

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。

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

【问题讨论】:

  • 我的回答解决了你的问题吗?让我知道它是否有帮助。 :)
  • @Gjaldon 对我来说看起来不错。我还没有时间研究它。我会尽早给你赏金。
  • @Gjaldon 赏金在时间结束后不会被浪费,在被浪费或自动分配之前,有一个宽限期可以使用赏金。

标签: javascript ruby-on-rails ruby json jbuilder


【解决方案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

如果有帮助请告诉我!

【讨论】:

    【解决方案2】:

    render_to_string 更改 content_type 以进行后续渲染存在一些问题。见:https://github.com/rails/rails/issues/14173

    一些可能的解决方法是

    • 在调用渲染时显式设置content_type,例如render content_type: text/html
    • 在调用render_to_string 后为响应显式设置content_type。如果您将render_to_string 放在控制器辅助方法中并且不希望调用辅助方法的任何人都知道这种怪异,则此选项可能是首选。例如response.headers["Content-Type"] = request.format.to_s

    【讨论】:

      猜你喜欢
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 2018-07-29
      • 2023-02-13
      相关资源
      最近更新 更多