在类中使用haml_tag,haml_concat?

时间:2012-05-17 20:25:41

标签: ruby haml

我在Haml中定义了一个class,我希望能够在这个类中使用Haml助手。例如:

- class Whatever
  - def self.write
    - haml_concat "something"

- Whatever.write

理想情况下,Whatever.write会将"something"输出到模板,但它只会以undefined method 'haml_concat' for Haml::Engine::Whatever:Class失败。

完整的堆栈跟踪:

haml_test.haml:5:in `write': undefined method `haml_concat' for Haml::Engine::Whatever:Class (NoMethodError)
    from haml_test.haml:8:in `block in render'
    from /home/fraser/.rvm/gems/ruby-1.9.3-p125/gems/haml-3.1.4/lib/haml/engine.rb:191:in `eval'
    from /home/fraser/.rvm/gems/ruby-1.9.3-p125/gems/haml-3.1.4/lib/haml/engine.rb:191:in `render'
    from /home/fraser/.rvm/gems/ruby-1.9.3-p125/gems/haml-3.1.4/lib/haml/exec.rb:281:in `process_result'
    from /home/fraser/.rvm/gems/ruby-1.9.3-p125/gems/haml-3.1.4/lib/haml/exec.rb:41:in `parse'
    from /home/fraser/.rvm/gems/ruby-1.9.3-p125/gems/haml-3.1.4/lib/haml/exec.rb:21:in `parse!'
    from /home/fraser/.rvm/gems/ruby-1.9.3-p125/gems/haml-3.1.4/bin/haml:9:in `<top (required)>'
    from /home/fraser/.rvm/gems/ruby-1.9.3-p125/bin/haml:19:in `load'
    from /home/fraser/.rvm/gems/ruby-1.9.3-p125/bin/haml:19:in `<main>'

如何让它正常工作?我尝试过同时使用extendinclude Haml::Helpers,但它们都失败了。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

您可以尝试传入haml上下文。我不知道这是否有效,如果它能满足你的目的,那就是它,但这是一个想法(我没有办法测试它)。

- class Whatever
  - def self.write(ctx)
    - ctx.haml_concat "something"

- Whatever.write(self)

如果这确实有效(再次,我真的不知道),你也可以尝试将上下文作为Whatever类级实例变量传递,这样你就可以使用你的Whatever编写器,而不必每次都传递haml上下文时间。

答案 1 :(得分:0)

试试这个:

- @self = self
- class Whatever
  - def self.write
    - @self.haml_concat "something"

- Whatever.write

但是,again,HAML是一种标记语言,你不应该在其中声明类。它也违背了MVC的原则。

答案 2 :(得分:0)

传递这个东西不是更容易吗?

= "something #{@my_object.my_method}"
= @my_object.my_other_method

我错过了什么?我不清楚你想要完成什么。