Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何用液体替代erb?_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 如何用液体替代erb?

Ruby on rails 如何用液体替代erb?,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我想在Rails应用程序中使用liquid。我已经安装了宝石。为了在所有模板中使用,我创建了一个库(lib/liquid\u view.rb:): 并添加了以下初始化器(config/initializers/liquid\u template\u handler.rb:): 附言:我已经按照指示做了 现在,如果使用liquidmy_template.html.liquid重命名模板文件,则停止工作,但更重要的是,{{user.first\u name}}变量没有打印出来。在我的控制器中,我有@

我想在Rails应用程序中使用liquid。我已经安装了宝石。为了在所有模板中使用,我创建了一个库(
lib/liquid\u view.rb:
):

并添加了以下初始化器(
config/initializers/liquid\u template\u handler.rb:
):

附言:我已经按照指示做了

现在,如果使用liquid
my_template.html.liquid
重命名模板文件,则
停止工作,但更重要的是,
{{user.first\u name}}
变量没有打印出来。在我的控制器中,我有
@user=current\u user

我错过了什么

我的意图是在某些模板中使用
liquid
完全覆盖
erb
,因此理想情况下,它应该像
erb
一样工作(从某种意义上说,我可以从控制器传递变量,只需在模板中呈现它,而无需使用
liquid::template.parse(@page.template)
顺便说一句,我不明白它是如何在基于文件的模板上工作的

另外,我还将[this]gem()用于单独的模板。我不确定它对它有什么影响

PPS:我见过但不适用,因为它是Rails的旧版本,我没有使用prepend


购买力平价:我使用的是Ruby 2.2.2和Rails 4.2,我希望这不是你所认为的问题。你可以像这里所说的那样检查方法

你是否创建了访问@user的下拉菜单

Liquid是一个安全的模板系统,因此我们可以在用户创建的后端模板上进行解释。要访问任何非平凡的内容(数字、字符串、哈希或数组),您需要一个Drop,它是一个受控接口,用于定义模板可以访问的内容


这是出于设计和安全原因。

Hi@code.prio。很遗憾,我担心这并没有回答我的问题。正如它所说的……液体默认带有正确的初始值。所以这不会是一个问题。要完全使用它,你必须在/vendor上提取它。你能确认吗?我可能错了。但请让我知道。我没有工作k使用Liquid超过3-4次该文档是从2013年开始的。Rails脚本在Rails 4中已被弃用。我已在gemfile中将其作为gem安装,并尝试按原样使用,但它不起作用。我认为这与
Liquid::Template.parse(@page.Template)
有关,但我不知道如何从文件加载模板(就像常规的erb模板位于
app/views…
好的,您已经使用了名为“liquid”的Gem)但是现在你能阅读一些关于这方面的内容并做出决定了吗:我仍然不理解它的原理。上面的文章是否说我需要为我想要使用liquid的每个模型创建一个类?或者添加
liquid\u属性你不能从liquid模板访问对象,除非它是基本类型(布尔、数字、字符串、数组或哈希)。唯一的例外是Liquid::Drop对象,它充当实际对象和模板之间的安全接口。我更新了指向另一个wiki页面的链接,这可能更好地解释了如何定义和使用Drop:它们是接口对象,定义模板如何安全访问原始对象以及可以安全访问哪些对象。Drop上的每个方法t返回一个基本类型或另一个drop。
class LiquidView
  def self.call(template)
    "LiquidView.new(self).render(#{template.source.inspect}, local_assigns)"
  end

  def initialize(view)
    @view = view
  end

  def render(template, local_assigns = {})
    @view.controller.headers["Content-Type"] ||= 'text/html; charset=utf-8'

    assigns = @view.assigns

    if @view.content_for?(:layout)
      assigns["content_for_layout"] = @view.content_for(:layout)
    end
    assigns.merge!(local_assigns.stringify_keys)

    controller = @view.controller
    filters = if controller.respond_to?(:liquid_filters, true)
                controller.send(:liquid_filters)
              elsif controller.respond_to?(:master_helper_module)
                [controller.master_helper_module]
              else
                [controller._helpers]
              end

    liquid = Liquid::Template.parse(template)
    liquid.render(assigns, :filters => filters, :registers => {:action_view => @view, :controller => @view.controller})
  end

  def compilable?
    false
  end
end
require 'liquid_view'
ActionView::Template.register_template_handler :liquid, LiquidView