Haml :: Engine.render не будет размещать содержимое из блока внутри соответствующего содержащего элемента - PullRequest
3 голосов
/ 18 января 2012

Давайте сначала начнем с фрагмента кода, чтобы объяснить проблему:

= Haml::Engine.new('#bar= yield').render do
  this should show up inside div#bar, right?

Учитывая этот код и в соответствии с документами haml :: engine и несколькими сообщениями stackoverflow , я ожидаю, что строка "" должна отображаться внутри div, верно?"на самом деле в конечном итоге окажется внутри элемента div # bar, в результате чего некоторый html будет выглядеть так:

  <div id="bar">
    this should show up inside of the div, right?
  </div>

Однако вот что я на самом деле получаю:

  this should show up inside of the div, right?
  <div id="bar">
    0
  </div>

Итак, два вопроса:

  1. Почему содержимое из блока отображается за пределами div # bar и
  2. Что это за 0 внутри элемента div # bar?

Ответы [ 2 ]

3 голосов
/ 16 мая 2013

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

Помощник :

module ApplicationHelper
  def generic_table(title, &block)
    template = File.read(File.join(Rails.root,'app','views', 'generic_table.html.haml'))
    haml_engine = Haml::Engine.new(template)
    haml_engine.render(Object.new, {:title => title}, &block)
  end
end

Просмотр:

= generic_table('Properties') do
  - capture_haml do
    Hello

Я бы хотел увидеть более простой способ сделать это

3 голосов
/ 18 января 2012

Это правильное поведение кода, который вы написали.Давайте посмотрим, например:

- ['1', '2' ,'3'].each do |var|
    %div= var

%div= var не возвращается в результате выполнения блока.В общем случае он работает в формате html.

В вашем случае:

= Haml::Engine.new('#bar= yield').render do
  this should show up inside div, right?

string this should show up inside div, right? отображается как haml и переходит непосредственно в html, а вы возвращаете блок 0. Поэтомутакой результат:

this should show up inside of the div, right?
<div id="bar">
    0
</div>

Итак, в вашем случае вы должны сделать так:

= Haml::Engine.new('#bar= yield').render { 'this should show up inside div, right?' }
...