Ruby on rails 如何用液体替代erb?
我想在Rails应用程序中使用liquid。我已经安装了宝石。为了在所有模板中使用,我创建了一个库(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}}变量没有打印出来。在我的控制器中,我有@
lib/liquid\u view.rb:
):
并添加了以下初始化器(config/initializers/liquid\u template\u handler.rb:
):
附言:我已经按照指示做了
现在,如果使用liquidmy_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