导轨:在产量之前干燥含量_for

时间:2014-11-22 11:46:21

标签: ruby-on-rails partial yield content-for

我有一部分需要包含一些js:view / main / _address_slider.html.erb

<% content_for :scripts  do %>
<%= javascript_include_tag 'swipeslider/dist/idangerous.swiper.min' %>
<%= javascript_include_tag 'fineuploader' %>
<% end %>
...

我有一个测试页面:view / main / test_partial_address_slider.html.erb

<% content_for :scripts  do %>
<%= javascript_include_tag 'swipeslider/dist/idangerous.swiper.min' %>
<%= javascript_include_tag 'mycustomplugin' %>
<% end %>
<% render 'address_slider' %>

我有一个特定的测试布局:view / layouts / test.html.erb

<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta name="description" content="Social Network">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title><%= @meta_title %></title>
<%= yield :meta %>
<%= yield :styles %>
<%= yield :scripts %>
</head>
<body>
<div id="page">
<%= display_flash %>
<%= yield %>
</div>
</body>
</html>

比我的控制器:controllers / main_controller

def test_partial_address_slider
render "test_partial_address_slider", layout: "test"
end

渲染页面包含两次swipeslider / dist / idangerous.swiper.min的js导入。

<head>
<meta charset="utf-8">
<meta name="description" content="Social Network">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>....</title> 
<script src="/assets/swipeslider/dist/idangerous.swiper.min.js?body=1" type="text/javascript"></script>
<script src="/assets/swipeslider/dist/idangerous.swiper.min.js?body=1" type="text/javascript"></script>
<script src="/assets/fineuploader.js?body=1" type="text/javascript"></script>
<script src="/assets/mycustomplugin.js?body=1" type="text/javascript"></script>
</head>

我可以在布局中的yield之前从content_for中删除副本吗?

2 个答案:

答案 0 :(得分:0)

您可以使用这样的帮助:

def yield_something_once
  unless @yielded_something
    @yielded_something = true
    content_for :something
  end
end

或者只需在content_for(:smth, '')之后立即使用yield :smth清除它。

答案 1 :(得分:0)

我找到了修复但它看起来很可怕!

<% s = yield(:scripts)  %>
<%= (((s.split("<script").uniq.collect{|x| x.strip}).reject(&:empty?)).map! { |word| "<script #{word}" }).join("\n").html_safe %>