Как создать помощник HAML6, который выполняет рендеринг и возврат одновременно?

Я пытаюсь создать помощник для HAML, который будет работать следующим образом:

%table
- tabular(items) do |i|
  %tr
    %td
      = i[:title]

Я ожидаю, что он отобразит следующий HTML:

<table>
  <tr><td>first</td></tr>
  <tr><td>second</td></tr>
  <tr><td>Total: 2</td></tr> <!-- This is not an item! -->
</table>

Я пробую этот подход, но не работает:

def tabular(items)
  total = 0
  items.each do |i|
    total += 1
    yield i
  end
  "<tr><td>Total: #{total}</td></tr>" # this line doesn't print :(
end

🤔 А знаете ли вы, что...
Ruby активно используется во множестве веб-сервисов и стартапов.


1
51
1

Ответ:

Решено

Существует выходная переменная экземпляра буфера@_out_buf, к ней можно добавить:

# views/index.haml

- items = [{title: :first}, {title: :second}]

%table
  # you have to indent this
  - tabular(items) do |i|
    %tr
      %td
        = i[:title]
# app.rb

require "sinatra"

helpers do
  def concat string
    @_out_buf << string
  end

  def tabular(items)
    total = 0
    items.each do |i|
      total += 1
      yield i
    end
    concat "<tr><td>Total: #{total}</td></tr>"
  end
end

get "/" do
  haml :index
end

Рендеры:

<table>
 <tr><td>first</td></tr>
 <tr><td>second</td></tr>
 <tr><td>Total: 2</td></tr>
</table>