Ответ 1
Из reference:
def render_haml(code)
engine = Haml::Engine.new(code)
engine.render
end
Это инициирует новый движок Haml и отображает его.
Во время рефакторинга было бы очень удобно просто скопировать часть шаблона HAML и вставить его в вспомогательный код. В настоящее время в таких случаях 1) Я должен переписать эту часть зрения с нуля. 2) Я должен использовать этот подробный синтаксис, например content_tag или haml_tag.
Я знаю, что можно определить частичные элементы с помощью синтаксиса HAML, который будет служить помощником. Хотя 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 для элементов многократного использования (помощники/функции/частичные/сборщики/etc)?
Из reference:
def render_haml(code)
engine = Haml::Engine.new(code)
engine.render
end
Это инициирует новый движок Haml и отображает его.
Если все, что вам нужно, это метод для небольших фрагментов многократного использования, как насчет частичных значений с локальными переменными? http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials
У 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
Я использовал 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