2014-11-22 3 views
0

У меня есть частичный, который нужно включить некоторые ЯША: вид/главный/_address_slider.html.erbRails: Сухое content_for перед тем выходом

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

У меня есть страница тестирования: вид/главный/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' %> 

у меня есть конкретный макет тест: вид/макеты/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> 

Чем в моем контроллере: контроллеры/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 перед выходом в моем макете?

ответ

0

Вы можете использовать помощника, как это:

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

Или просто использовать content_for(:smth, '') сразу после yield :smth, чтобы очистить его.

+0

не совсем потому, что вы пытаетесь сказать что-то вроде, если вы уже уступили: скрипты, больше не уступайте его. Но я хочу собрать все сценарии content_for: (потому что они могут быть разными), а затем перемещать весь: script content_for и удалять дубликат. – rolele

+0

Нет такой функциональности. Вы должны определить массив скриптов как переменную экземпляра и использовать хелпер (ов) для добавления скриптов. Или вы можете попробовать '<% content_for: smth do%><% = yield: smth if content_for? : smth%> здесь дополнительный html <% end %> '(я не пробовал, но, похоже, все в порядке). – prcu

+0

Извините, я только что прочитал, что по умолчанию 'content_for' работает так, как вы хотите (в 4.1, не проверял другие версии). Он конкатенирует результат, если вызывается несколько раз: http://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-content_for – prcu

0

Я нашел исправление, но это выглядит ужасно!

<% s = yield(:scripts) %> 
<%= (((s.split("<script").uniq.collect{|x| x.strip}).reject(&:empty?)).map! { |word| "<script #{word}" }).join("\n").html_safe %> 
Смежные вопросы