Разделение выполнения Javascript по контроллерам

По идеалогии rails грузит весь код javascript один раз при первом обращении к сайту и потом лишь обновляет содержимое <body>. Вот один из самых удачных способов на мой взляд разделить выполнение javascript по котроллерам и даже экшенам.


1.Записываем называние котроллера и экшена в дата-параметры:

<body data-controller="<%= controller.controller_name %>" data-action="<%= controller.action_name %>">

2.Испускаем события при обновлении страницы:

// application.js
$(document).on("page:change", function(){
    var data = $('body').data();
    $(document).trigger(data.controller + ':loaded');
    $(document).trigger(data.controller + '#' + data.action + ':loaded');
});

Замечание! Событие page:change используется для идепотентных функций, так как оно вызываетя каждый раз при изменении DOM. Для того чтобы гарантированно вызываться один раз перед загрузкой страницы лучши ловить событие page:load


3.Ловим события:

$(document).on('users#show:loaded', function(){
    $('#logger').append('<li>Users Show action loaded</li>');
});
$(document).on('users:loaded', function(){
    $('#logger').append('<li>Some users controller method loaded</li>');
});