【问题标题】:Passing rails variable to liquid works in console but not in view将rails变量传递给液体在控制台中工作但不在视图中
【发布时间】:2020-09-23 17:13:32
【问题描述】:

我想将哈希传递给渲染方法。当我这样做时,在我的控制台中一切正常:

@object = Object.find(params[:id])
@hash_object = @object.to_liquid

@template = Liquid::Template.parse("Welcome to {{object_title}}")
@template.render('object_title' => @hash_object["title"])

但是当我想通过我的控制器呈现页面并将其传递给需要香草液体的应用程序代理时,哈希键没有出现。但它被解释了,因为视图显示空白。如果它根本不起作用,视图会显示:“欢迎来到 {{object_title}}”,或者由于语法错误甚至不加载。

我尝试了几乎所有可能的方式来呈现模板。接下来的两个试用版不会引发错误,但仅在标题应出现的位置显示空白:

@pageview = Liquid::Template.parse(File.read(Rails.root + "app/views/app_proxy/show.html.erb"))
render text: @pageview.render('object_title' => @hash_object["title"]), content_type: "application/liquid"

第二个(我认为它更干净,更像红宝石):

    respond_to do |format|
      format.html do
      render text: @pageview.render('object_title' => @hash_object["title"]), layout: false,  content_type: "application/liquid"
      end
    end

这些渲染图中的错误在哪里,或者我遗漏了什么?

【问题讨论】:

  • 当你检查 @hash_object["title"] 类时,它会返回 String 还是别的什么?可能只是您告诉它@hash_object["title"].to_s 的情况。虽然我没有使用 Liquid,但如果由于某种原因它没有从密钥中读取您的值,Ruby 可能会将其解释为其他内容。
  • 哈希方法是在我的模型中定义的,我用 is_a?(String) 检查了类型,这给了我一个“真”。尽管如此,我还是添加了它并以相同的结果部署它。
  • 好的。我还注意到您尝试在 Liquid 中渲染 .erb 文件,然后使用它渲染 text。但我的问题是:如果你渲染原始文件会发生什么,而不是render text 放置render file?除了 HAML 和 ERB 之外,我真的不太习惯使用其他模板引擎,所以这可能不是最好的建议。
  • 现在尝试将其作为本地渲染文件。结果相同
  • 对不起,我的回答不适用于这里。我尝试了另一个答案。我会删除这个

标签: ruby-on-rails liquid


【解决方案1】:

@变量被分配给一个类的实例,而不是类本身,所以你需要将它声明为“initialize”方法(或“setup”方法,如果是测试)

【讨论】:

  • 感谢提示。根本没听说过。你能给我一个很好的链接吗?我不知道如何处理 gem doc 中与这个主题相关的简短章节
  • 抱歉造成误会。我知道实例变量和局部变量之间的区别。我的意思是一个关于初始化方法以及如何以及在哪里正确构建它的链接。 gem 文档关于该主题的内容非常简短。
  • 我认为这个答案在这里不适用,我添加了另一个。我会删除这个
  • 你的第一个提示真的帮助了我。我想我必须使用标签和drop。如果我能够让它们运行,我认为 drop 可能是最好的解决方案。使用标签,我必须将每个属性编码为自己的标签方法。我想我可以节省很多时间来编写一个继承自 Liquid::Drop 的类并定义我的对象。
【解决方案2】:

render html: 而不是render text:

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
相关资源
最近更新 更多