0

私は Haml 内で a を定義してい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>'

これを正しく機能させるにはどうすればよいですか?extendと の両方を使用してみましinclude Haml::Helpersたが、どちらも失敗します。何か案は?

4

3 に答える 3

0

物自体を渡す方が簡単ではないでしょうか。

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

私は何が欠けていますか?あなたが何を達成しようとしているのかわかりません。

于 2012-05-17T22:45:20.363 に答える
0

haml コンテキストを渡してみることができます。これがうまくいくかどうか、それがあなたの目的に合っているかどうかはわかりませんが、それはアイデアです(テストする手段がありません)。

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

- Whatever.write(self)

これが機能する場合 (これもよくわかりません)、コンテキストをWhateverクラスレベルのインスタンス変数として渡すこともできます。これにより、毎回hamlコンテキストを渡すことなくWhateverライターを使用できます。

于 2012-05-17T20:34:55.003 に答える
0

これを試して:

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

- Whatever.write

しかし、繰り返しになりますが、HAML はマークアップ言語であり、その中でクラスを宣言するべきではありません。また、MVC の原則に反します。

于 2012-05-17T20:37:47.223 に答える