а нахрена?
на странице могут быть разные блоки (html), часть из которых требуют одну и ту же либу (jquery). мне удобнее привязывать клиентские скрипты к блокам, а не к страницам целиком.
например есть блок с fancybox и блок кнопок на jqueryui, оба требуют jquery и оба находятся на одной странице. при этом мне надо чтобы если я уберу один из них другой продолжал работать, а если уберу оба - то чтоб ненужные скрипты на загружались
lazy loading короче
Спустя 185 сек.
в общем решение я нашёл, вот такое
module ApplicationHelper
def require_script(src)
if @scripts.nil?
@scripts = []
end
if @scripts.none? {|s| s == src}
@scripts.push src
end
end
def require_jquery
require_script 'jquery/jquery-latest.js'
end
def require_jqueryui
require_jquery
require_script 'jquery/ui/jquery-ui-latest.min.js'
require_script 'jquery/ui/external/jquery.bgiframe-2.1.2.js'
require_css '/javascripts/jquery/ui/themes/smoothness/jquery.ui.all.css'
end
def get_scripts_html
unless @scripts.nil?
raw @scripts.map{|s| javascript_include_tag s}.join("\n")
end
end
def require_css(src)
if @styles.nil?
@styles = []
end
if @styles.none? {|s| s == src}
@styles.push src
end
end
def get_css_html
unless @styles.nil?
raw @styles.map{|s| stylesheet_link_tag s}.join("\n")
end
end
end
Спустя 196 сек.
в лэйауте делаем так
<!DOCTYPE html>
<html>
<head>
<!– тут подключаем стили столько раз сколько нужно –>
<%- require_css 'main.css' %>
<!– тут выводим список подключаемых стилей –>
<%= get_css_html %>
<%= csrf_meta_tag %>
</head>
<body>
<!– основной контент –>
<%= yield %>
</body>
<!– подключаемые скрипты –>
<%= get_scripts_html %>
<!– инлайновые скрипты –>
<%= yield :js %>
</html>
причём инлайновые скрипты должны писаться так, чтоб реагировать на document.onload
Спустя 239 сек.
во вьюхах делаем так
…
<%- require_jquery %>
<%- content_for :js do javascript_tag do %>
$(function(){
alert('JQuery инициализировано');
})
<%- end end %>
при этом скрипты получаются внизу страницы
не всё полезно, что в swap полезло