Подтвердить что ты не робот

Rails: возможно ли написать помощники вида с синтаксисом 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)?

4b9b3361

Ответ 1

Из reference:

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

Это инициирует новый движок Haml и отображает его.

Ответ 3

У 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

Ответ 4

Я использовал 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