Ruby on rails 3 同一页面上的多个内容\u
我的应用程序中有一大块HTML,我希望将其移动到共享模板中,然后使用content_插入必要的内容。但是,如果我在同一个布局文件中多次使用它,则内容_只是附加到前面的内容,这使得该想法无法很好地发挥作用。有解决办法吗Ruby on rails 3 同一页面上的多个内容\u,ruby-on-rails-3,yield,content-for,Ruby On Rails 3,Yield,Content For,我的应用程序中有一大块HTML,我希望将其移动到共享模板中,然后使用content_插入必要的内容。但是,如果我在同一个布局文件中多次使用它,则内容_只是附加到前面的内容,这使得该想法无法很好地发挥作用。有解决办法吗 <div class="block side"> <div class="block_head"> <div class="bheadl"></div> <div class="bhead
<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>
我也可能是完全错误的,如果有更好的方法让内容像这样工作,我想知道。谢谢。您可以将命名的
内容\u用于和生成块,如下所示:
视图:
职务
正文
按作者姓名
然后在布局中:
<%= yield :heading %>
<%= yield %>
<%= yield :footer %>
当然,您可以按任何顺序定义它们
文档:我不确定我是否真的理解了您的问题-以下是一种有效的代码方法:
视图:
测试一
测试二
嗨
application.html.erb
<%= yield :one %>
<%= yield %>
<%= yield :two %>
RailsGuide:您应该将覆盖内容定义为以下内容(如果我正确理解您的问题):
请注意,如果您的块产生nil,那么旧内容将被保留。但是,整个想法听起来并不好,因为您显然要进行两次渲染(或至少对象实例化)。您可以直接传递内容,而不依赖于块:
<% content_for :replaced_not_appended %>
在Rails 4中,您可以传递:flush参数来覆盖内容
<%= content_for :block_head, 'hello world', :flush => true %>
true%>
或者,如果你想通过一个街区
<%= content_for :block_head, :flush => true do %>
hello world
<% end %>
true do%>
你好,世界
参见本助手的更多详细信息为什么投否决票?原来的问题在我的回答之后被编辑了。它现在包含了更多的细节…这就成功了,谢谢。我确实理解渲染两次的问题,但似乎使用内容和布局比在我需要显示的任何地方粘贴大的HTML块更可取。你不能用简单的部分吗?在某些情况下,我会将大量HTML内容传递到:block\u content yield。我不知道如何使用partials实现这一点。基本上,如果这个HTML是静态的,那么它可能应该进入partial,如果它是动态的,那么应该进入helper。如果您不传递:flush,您还可以使用content_for在一个区域中附加多个代码段。但是您必须不使用,并且使用内容来输出。
<%= yield :one %>
<%= yield %>
<%= yield :two %>
def overwrite_content_for(name, content = nil, &block)
content = capture(&block) if block_given?
@_content_for[name] = content if content
@_content_for[name] unless content
end
<% content_for :replaced_not_appended %>
<%= content_for :block_head, 'hello world', :flush => true %>
<%= content_for :block_head, :flush => true do %>
hello world
<% end %>