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 并safe_concate返回整个 output_buffer。

结果,block.call也返回整个 output_buffer。但是,capture(&block)在调用块之前创建一个新缓冲区并且只返回块的内容。

于 2012-11-27T10:14:53.957 回答