Как создать помощник 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

как ты это передаешь, это просто хамл? в рельсах, которые вы бы использовали concat

Alex 13.08.2024 21:57

Это Sinatra/HAML, а не Rails

yegor256 14.08.2024 09:41
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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>

Другие вопросы по теме