0

Sass ミックスインを使用して、カスタマイズ可能なラッパーでコード ブロックをラップできる方法がとても気に入っています。

=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 パーシャルはコンテンツ ブロックを受け入れますが、構文は少し異なります。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 に答える