0

我真的很喜欢 Sass mixins 如何让您使用可自定义的包装器来包装代码块:

=container($class)
  .#{$class}.container
    .container-inner
      @content

+container(header)
  foo: bar

+container(main)
  baz: quux

生成的 CSS:

.header.container .container-inner {
  foo: bar;
}

.main.container .container-inner {
  baz: quux;
}

我正在尝试对 Padrino/Middleman 部分做同样的事情。问题是部分不接受内容块(为什么?)。:(

我试图通过将内容块传递给 来解决它content_for,但随后使用的content_for将附加到内容而不是替换它:

部分partials/container.haml

.container
  = yield_content :container

页面index.html.haml

- content_for :container do
  Foo

= partial('partials/container')


- content_for :container do
  Bar

= partial('partials/container')

生成的 HTML:

<div class="container">
  Foo
</div>
<div class="container">
  Foo
  Bar
</div>

如您所见,它复制了我的内容,这是绝对不可接受的。此外,这种方式不允许提供用于自定义包装 HTML 的参数。

所以我想创建一个助手。它将启用以下使用方式,这种方式比内容块更优雅content_for,并且还支持将变量传递到内容块

= partial_with_content_block('partials/container', class: 'header') do
  Foo

= partial_with_content_block('partials/container', class: 'main') do
  Bar

我如何实现这样的助手?

4

2 回答 2

1

像这样的东西应该可以工作,但我遗漏了部分内容:

def container(options={}, &block)
  raise ArgumentError, "Missing block" unless block_given?
  content = capture_html(&block)
  content_tag(:div, content, options)
end

调用为:

= container(class: 'main') do
  p More content here

但现在我认为如果是这样,这一切都可以用默认的 Padrino 方法来处理:

= content_tag :div, class: 'main' do
  p More content
于 2013-11-08T14:52:48.197 回答
1

Middleman partials 确实接受内容块,但语法略有不同。下面给出了 ERB,但您也应该能够在 HAML 中执行此操作。

<% partial 'my_partial' do %>
    My Content
<% end %>

my_partial.html.erb

<p>
    <%= yield %>
</p>

结果

<p>
    My Content
</p>
于 2015-12-07T21:48:33.677 回答