Как правильно вызывать функции javascript из представления rails?

#javascript #ruby-on-rails

Вопрос:

Я действительно новичок в rails, и конвейер активов немного сбил меня с толку. Насколько я понимаю, все файлы javascript в assets/javascripts каталоге скомпилированы в один отдельный файл js, называемый application.js , который содержит все функции во всех файлах js в каталоге. Мой первый вопрос: что произойдет, если возникнет конфликт имен и два файла assets/javascripts будут иметь функции с одинаковыми именами?

Во-вторых, какова наилучшая практика вызова этих функций? Например, на мой взгляд, у меня есть модал с формой, при отправке которой я хочу, чтобы модал исчез. Я могу это сделать

приложение/просмотры/мой каталог/индекс.html.haml

 = form_with url: my_directory_path, class: "form", :html => { onsubmit: "hideModal()" },  method: :get do |form|
            = form.date_select
            %br
            %button.btn.btn-primary{type: "submit", class: "submitBtn"} Submit
 

app/assets/javascripts/modal.js

 function hideModal() {
    $modal.modal('hide');
}
 

И это прекрасно работает. Но из того, что я прочитал, не рекомендуется вызывать javascript из вашего представления rails. Итак, мой второй вопрос: что ТАКОЕ хорошая практика? Я попытался удалить этот onsubmit параметр из своей формы и сделать это вместо этого

modal.js

 $('.form').submit(function() {
$modal.modal('hide');
})
 

но это не работает. Я предполагаю, потому что он не может найти форму, потому что в ней нет тега сценария с файлом javascript index.html.haml . Я предполагаю, что я неправильно понимаю, как работает конвейер ресурсов и как он «связывает» ваши файлы javascript и представления вместе.

Я работаю с Rails 5.2.

Комментарии:

1. Прежде чем углубляться в этот вопрос, вы, вероятно, захотите определить свою версию Rails, чтобы выяснить, можете ли вы делать что-то только по-старому (конвейер активов) или по-новому ( webpacker в Rails 5 и 6). Хотя вы все еще можете использовать конвейер ресурсов с последними основными версиями Rails, вы можете воспользоваться некоторыми преимуществами, предоставляемыми webpacker.

2. Я на рельсах 5.2

3. Если JS отображается до готовности DOM, то еще не будет .form ; обработчики событий присоединения должны быть выполнены в DOM ready.