18

在重构过程中,只需复制 HAML 模板的一部分并将其粘贴到帮助程序的代码中就很方便了。目前在这种情况下 1) 我必须从头开始重写视图的那一部分 2) 我必须使用像 content_tag 或 haml_tag 这样的冗长语法。

我知道可以使用 HAML 系统税定义部分作为帮助程序。虽然 1)对我来说,为每个小函数创建一个单独的文件是不方便的 2)partial 的调用语法非常冗长。

理想情况下,我希望我的 *_helper 类看起来像这样:

- def some_helper(*its_args)
  .some_class
    = some_ruby_expression
  %some_tag#some_id
    - another_expression do
      etc

或者至少是这样的:

define_haml_helper :some_helper, [:arg1, :arg2], %{
  .some_class
    = some_ruby_expression
  %some_tag#some_id
    - another_expression do
      etc
}

有没有解决我问题的插件?

或者,也许您可​​以描述如何将 HAML 片段重构为可重用元素(助手/函数/部分/构建器/等)?

4

4 回答 4

13

参考

def render_haml(code)
    engine = Haml::Engine.new(code)
    engine.render
end

这会启动一个新的 Haml 引擎并进行渲染。

于 2011-03-09T12:41:09.483 回答
4

如果您所追求的只是一种可重复使用的小片段的方法,那么带有局部变量的部分呢?http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials

于 2011-03-30T21:18:30.340 回答
4

Haml 现在有一种capture_haml方法可以用来完成此任务。

  def some_helper
    capture_haml do
      .some_class
        = yield
      #some-code-after
    end
  end

some_helper do
  %h1 Hello World
end
=> <div class="some_class">
     <h1>Hello World</h1>
   </div>
   <div id="some-code-after"></div>

这是一个包含更多信息的链接:http capture_haml: //haml.info/docs/yardoc/Haml/Helpers.html#capture_haml-instance_method

于 2013-10-10T19:45:31.887 回答
0

我将heredoc用于此类目的:

  def view_helper
    Haml::Engine.new(<<~HAML).render
      .example
        #id ID
        .desc Description
    HAML
  end

这种方式在变量范围方面存在很多问题,因此,如上所述,更正确的方式是为此使用局部变量。

UPD1:这是关于如何解决范围问题的解决方案:

  def view_helper
    Haml::Engine.new(<<~HAML).render(self)
      .form
        = form_tag root_path do
          = submit_tag :submit
    HAML
  end

UPD2:更好的解决方案(基于互联网):

def render_haml(haml, locals = {})
  Haml::Engine.new(haml.strip_heredoc, format: :html5).render(self, locals)
end

def greeting
  render_haml <<-HAML
    .greeting
      Welcome to
      %span.greeting--location
        = Rails.env
  HAML
end
于 2019-09-18T09:49:27.433 回答