8

背景

我正在尝试在Rails之外测试一些 HAML 模板的格式。这个想法是在命令行或通过包含的 Ruby 文件传递​​一些实例变量,将模板呈现为标准输出。我尝试了几种不同的方法但没有成功,如下所述。

需要一个 Ruby 文件

例如,给定以下两个文件:

  • HAML 模板:“test.haml”

    !!!
    %h1 Testing HAML CLI
    %p= @bar
    %p= @baz
    
  • 红宝石文件:“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?

4

2 回答 2

13

您可以为该方法提供范围对象和局部变量哈希render。在您的示例中,您将调用:

engine = Haml::Engine.new(File.read 'test.haml')
engine.render(Object.new, { :@foo => 'abc', :@bar => '123' })
于 2013-04-15T22:25:14.580 回答
3

这两个示例都不起作用的原因是您试图从不同的类访问实例变量。最简单的解决方案是定义和使用方法,而不是尝试访问其他类的实例变量,就好像它们是你自己的一样。

test.rb 中的 IE

def foo
  'abc'
end

测试.haml

!!!
%h1 Testing HAML CLI
%p= foo
于 2013-04-15T22:26:54.013 回答