我在我的应用程序中有大块的
HTML,我想进入共享模板,然后使用content_for和yield来插入必要的内容.但是,如果我在同一个布局文件中多次使用它,则content_for只会附加到之前的那个想法不能很好地工作.这个问题有方法解决吗?
<div class="block side"> <div class="block_head"> <div class="bheadl"></div> <div class="bheadr"></div> <h2><%= yield :block_head %></h2> </div> <div class="block_content"> <%= yield :block_content %> </div> <div class="bendl"></div> <div class="bendr"></div> </div>
<%= overwrite_content_for :block_head do -%> My Block <% end -%> <%= overwrite_content_for :block_content do -%> <p>My Block Content</p> <% end -%> <%= render :file => "shared/_blockside" %>
问题是如果我在同一布局上多次使用它,原始块中的内容将附加到辅助块
我已经尝试创建一个自定义帮助方法来解决它,但它不会返回任何内容
def overwrite_content_for(name,content = nil,&block) @_content_for[name] = "" content_for(name,content &block) end
解决方法
您应该将overwrite_content_for定义如下(如果我正确理解您的问题):
def overwrite_content_for(name,&block) content = capture(&block) if block_given? @_content_for[name] = content if content @_content_for[name] unless content end
请注意,如果您的块产生nil,则将保留旧内容.然而,整个想法听起来不太好,因为你显然做了两次渲染(或至少是对象实例化).