在重构期间,复制HAML模板的一部分并将其粘贴到帮助程序的代码是非常方便的。目前在这种情况下1)我必须从头开始重写该部分视图2)我必须使用详细的语法,如content_tag或haml_tag。
我知道可以使用HAML systax来定义部分内容,这些内容将作为帮助程序。虽然1)对我来说,为每个小的微小函数创建一个单独的文件是不方便的2)部分的调用语法非常详细。
理想情况下,我希望我的* _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片段重构为可重用元素(帮助者/函数/部分/构建器/等)?
答案 0 :(得分:13)
来自reference:
def render_haml(code)
engine = Haml::Engine.new(code)
engine.render
end
这会启动一个新的Haml引擎并呈现它。
答案 1 :(得分: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>
以下是有关capture_haml
的更多信息的链接:
http://haml.info/docs/yardoc/Haml/Helpers.html#capture_haml-instance_method
答案 2 :(得分:3)
如果你所追求的是一个小的可重复使用的片段的方法,那么局部变量局部变量怎么样? http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials
答案 3 :(得分: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