Рельсы: Сухое содержание_ для до выхода
У меня есть часть, которая должна включать некоторые 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
Отрендеренная страница дважды содержит импорт js файла swipeslider/dist/idangerous.swiper.min.
<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>
Могу ли я удалить дубликат из content_for до выхода в моем макете?
2 ответа
Вы можете использовать помощник следующим образом:
def yield_something_once
unless @yielded_something
@yielded_something = true
content_for :something
end
end
Или просто использовать content_for(:smth, '')
сразу после yield :smth
очистить это.
Я нашел исправление, но это выглядит ужасно!
<% s = yield(:scripts) %>
<%= (((s.split("<script").uniq.collect{|x| x.strip}).reject(&:empty?)).map! { |word| "<script #{word}" }).join("\n").html_safe %>