Rails: возможно ли получить контроллер и имя действия из файла активов?

Я хочу сделать что-то подобное в моем конвейере активов:

application.js

//= require jquery
//= require jquery_ujs
//= require_tree ./includes
//= require global
<% if File.exists? "#{Rails.root}/assets/javascripts/#{params[:controller]}.js" %>
    //= require <%= params[:controller] %>
<% end %>
<% if File.exists? "#{Rails.root}/assets/javascripts/#{params[:controller]}/#{params[:action]}.js" %>
    //= require <%= params[:controller] %>/<%= params[:action] %>
<% end %>

Теперь это не работает, потому что файлы ресурсов не могут получить доступ к переменной params. Теперь есть способ захватить то, что текущие имена действий контроллера из актива?

Или файл актива, предварительно скомпилированный для всего проекта, не может этого сделать?

Ответ 1

Возможно, вы сможете сделать это через какой-нибудь Tom Foolery, но я бы порекомендовал его против.

Причина, по которой я говорю, заключается в том, что вы хотите, чтобы этот ресурс js был кэшируемым, и для этого он действительно должен быть статичным. Настройка актива на основе того, какой контроллер вызывается, приведет к тому, что потенциально много уникальных ресурсов, все из которых должны быть идентифицированы, загружены и кэшированы отдельно. Отметив, что вы включили то, что, очевидно, являются неизменными ресурсами, такими как jQuery, и размышляя над тем, что их нужно будет загружать снова и снова, я думаю, что становится ясно, что этот подход не работает хорошо.

Если то, что вы пытаетесь сделать, это настроить инициализацию представления на основе контроллера/действия, я бы рекомендовал включать определения функций в статический ресурс js, который вы передаете, и затем вы можете вызвать его непосредственно со страницы.

Надеюсь, что это поможет.

Ответ 2

Активы будут предварительно скомпилированы в обычном режиме, это будет невозможно, если вы не отключите его и не построите на каждом запросе.

Если это для загрузки некоторых js, которые могут быть только на определенных страницах, тогда вы можете явно включать только этот файл в свои представления.

Если вы пытаетесь сделать это по соображениям производительности; загрузка 1 файла js на страницу, как правило, самая быстрая вещь. Весь файл может быть кэширован, и каждая загрузка страницы сохраняет несколько дополнительных запросов. Размер файла почти никогда не является фактором.

Обычно я следую схеме кодирования всех моих js файлов в одном, а затем с помощью обнаружения функции для включения определенного javascript, например, если какой-то элемент находится на странице, а затем загружать что-то.

$("body#user_show").each(function() {
    $(".user_info_box").each(load_user_info)
    // ...
})

Таким образом, я могу кэшировать все и загружать только js для вещей, которые я обнаружил на странице.

Ответ 3

Я бы не включил имя контроллера в javascript, так как вы хотите, чтобы ваши активы были кэшированы. Лучшим решением было бы использовать атрибуты данных, возможно, в теге, чтобы настроить процесс инициализации скриптов. Например,

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

Затем в вашем приложении application.js вы можете вызывать модули на основе имени контроллера, т.е. Users.init()