0

ERBテンプレートで次のパターンを使用して繰り返しコードを削減しようとしています。

<% if content_for(some_key) %>
  <%= yield(some_key) %>
<% else %>
  Some default values here
<% end %>

で次のメソッドを定義しようとしましたApplicationHelperが、当然のことながら、期待どおりに機能していません。

def content_for_with_default(key, &block)
  if content_for?(key)
    yield(key)
  else
    block.call
  end
end

これが私がそれを使おうとしている方法です:

<%= content_for_with_default(some_key) do %>
  Some default values here
<% end %>

content_for_with_default意図した効果が得られるようにヘルパーを作成するにはどうすればよいですか?

4

1 に答える 1

1

ヘルパーは次のようになります。

def content_for_with_default(key, &block)
  if content_for?(key)
    content_for(key)
  else
    capture(&block)
  end
end

capture(&block)編集:との違いblock.call

erb ファイルがコンパイルされると、ブロックは次のような ruby​​ コードになります。

');@output_buffer.append=  content_for_with_default('some_key') do @output_buffer.safe_concat('
');
@output_buffer.safe_concat('  Some default values here
'); end 

ご覧のとおり、ブロック内の文字列は output_buffer に連結され、output_buffersafe_concate全体を返します。

結果として、block.calloutput_buffer 全体も返します。ただし、capture(&block)ブロックを呼び出す前に新しいバッファーを作成し、ブロックの内容のみを返します。

于 2012-11-27T10:14:53.957 に答える