我正在尝试测试Rails外部某些HAML模板的格式。我们的想法是在命令行或通过包含的Ruby文件传递一些实例变量,将模板呈现为标准输出。我尝试了几种不同的方法但没有成功,如下所述。
例如,给出以下两个文件:
HAML模板:“test.haml”
!!!
%h1 Testing HAML CLI
%p= @bar
%p= @baz
Ruby文件:“test.rb”
@foo = 'abc'
@bar = '123'
我希望像haml -r ./test test.haml
这样的调用能够在标准输出上返回插值的HTML文件,但事实并非如此。相反,我只得到HTML:
<!DOCTYPE html>
<h1>Testing HAML CLI</h1>
<p></p>
<p></p>
由于这不起作用,我也尝试以编程方式执行此操作。例如:
#!/usr/bin/env ruby
require 'haml'
@foo = 'abc'
@bar = '123'
engine = Haml::Engine.new(File.read 'test.haml')
puts engine.render
具有完全相同的结果,例如只是没有变量插值的HTML。
显然,需要其他东西才能让HAML使用其关联变量呈现模板。我宁愿通过传递参数或包含文件从命令行执行此操作。我应该如何从命令行调用HAML来实现它?
如果由于某种原因这是不可能的,我应该如何以编程方式调用HAML来执行插值而不依赖于Rails?
答案 0 :(得分:13)
您可以为render
方法提供范围对象和局部变量哈希。在您的示例中,您将调用:
engine = Haml::Engine.new(File.read 'test.haml')
engine.render(Object.new, { :@foo => 'abc', :@bar => '123' })
答案 1 :(得分:3)
这两个示例都不起作用的原因是您尝试从其他类访问实例变量。最简单的解决方案是定义和使用方法,而不是尝试访问另一个类实例变量,就像它们是您自己的一样。
即。在test.rb
def foo
'abc'
end
test.haml
!!!
%h1 Testing HAML CLI
%p= foo