haml,blocks和partials

时间:2012-07-12 22:03:04

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 haml ruby-on-rails-3.2

为了清理和考虑丑陋的观点,我想做以下事情:

1)在视图中:

= document_left_container do
 = document_information

2)在我的帮手中:

  def document_left_container(&block)
    render partial: "/document_left_container", locals: { custom_block: block }
  end

   def document_information
    render partial: "document_information"
  end

3)部分:

对于document_left_container:

.foo
  = custom_block.call

对于document_information:

.bar

4)预期结果:

<div class='foo'>
  <div class='bar'>
  </div> 
</div>

5)实际结果:

<div class='foo'>
</div>
<div class='bar'>
</div>

有谁知道如何让我的东西工作?

提前致谢,

3 个答案:

答案 0 :(得分:1)

以下是我如何保持干爽:

=content_for(:document_information) do
  .bar

.foo
  =yield(:document_information)

这将产生

<div class='foo'>
  <div class='bar'>
  </div> 
</div>

答案 1 :(得分:0)

我目前的解决方案是:

助手:

def document_left_container(&block)
  content_for :document_left_container do
    block.call
  end
  render partial: "/document_left_container"
end

部分:

.foo
  = yield :document_left_container

休息保持不变,我真的想保持相同的结构。

仍然很想知道我的原始代码失败的原因。

答案 2 :(得分:0)

我认为您的原始代码失败了,因为您实际上是在调用render,然后再次调用render。所以你把东西推到了堆栈上,然后将其他东西推到了它上面。如果你这样做我认为它会起作用。 (虽然我没有测试过。)

def document_left_container(&block)
  capture_haml do 
    render partial: "/document_left_container", locals: { custom_block: block }
  end
end

 def document_information
  render partial: "document_information"
end