Bạn không nên tải các tệp JS hoặc CSS bên ngoài đường dẫn tài sản vì bạn mất đi các tính năng quan trọng khiến Rails trở nên tuyệt vời. Và bạn không cần một viên ngọc khác. Tôi tin rằng sử dụng càng ít đá quý càng tốt và sử dụng đá quý không cần thiết ở đây.
Những gì bạn muốn được gọi là "Javascript cụ thể của trình điều khiển" ("Javascript cụ thể hành động được bao gồm ở phía dưới). Điều này cho phép bạn tải một tệp JavaScript cụ thể cho một CONTROLLER cụ thể. Cố gắng kết nối Javascript của bạn với Chế độ xem là một loại .. ngược và không tuân theo mẫu thiết kế MVC. Bạn muốn liên kết nó với Bộ điều khiển hoặc hành động bên trong Bộ điều khiển của bạn.
Thật không may, vì bất kỳ lý do gì, các nhà phát triển Rails đã quyết định rằng theo mặc định, mọi trang sẽ tải mọi tệp JS nằm trong thư mục tài sản của bạn. Tại sao họ quyết định làm điều này thay vì bật "Trình điều khiển cụ thể Javascript" theo mặc định tôi sẽ không bao giờ biết. Điều này được thực hiện thông qua tệp application.js, bao gồm dòng mã sau theo mặc định:
//= require_tree .
Điều này được gọi là một chỉ thị . Đó là những gì sprockets sử dụng để tải mọi tệp JS trong thư mục tài sản / javascripts. Theo mặc định, sprockets tự động tải application.js và application.css và lệnh direct_tree tải mọi tệp JS và Coffee trong các thư mục tương ứng của chúng.
LƯU Ý: Khi bạn tạo giàn giáo (nếu bạn không lắp giàn giáo, bây giờ là thời điểm tốt để bắt đầu), Rails sẽ tự động tạo một tệp cà phê cho bạn, cho bộ điều khiển của giàn giáo đó. Nếu bạn muốn nó tạo tệp JS tiêu chuẩn thay vì tệp cà phê , thì hãy xóa đá quý cà phê được bật theo mặc định trong Gemfile của bạn và thay vào đó, giàn giáo của bạn sẽ tạo tệp JS.
Ok, vì vậy bước đầu tiên để bật "Javascript cụ thể của trình điều khiển" là xóa mã request_tree khỏi tệp application.js của bạn, HOẶC thay đổi nó thành một thư mục trong thư mục tài sản / javascripts của bạn nếu bạn vẫn cần các tệp JS toàn cầu. I E:
//= require_tree ./global
Bước 2: Đi vào tệp cấu hình / bộ khởi tạo / tài sản.rb của bạn và thêm vào như sau:
%w( controllerone controllertwo controllerthree ).each do |controller|
Rails.application.config.assets.precompile += ["#{controller}.js", "#{controller}.css"]
end
Chèn tên điều khiển mà bạn muốn.
Bước 3: Thay thế tệp javascript_include_tag trong tệp application.html.erb của bạn bằng phần này (lưu ý phần params [: controller]:
<%= javascript_include_tag 'application', params[:controller], 'data-turbolinks-track': 'reload' %>
Khởi động lại máy chủ của bạn và viola! Tệp JS được tạo bằng giàn giáo của bạn bây giờ sẽ chỉ tải khi bộ điều khiển đó được gọi.
Cần tải một tệp JS cụ thể trên một HÀNH ĐỘNG cụ thể trong bộ điều khiển của bạn , IE / bài viết / mới ? Thay vào đó, hãy làm điều này:
application.html.erb :
<%= javascript_include_tag "#{controller_name}/#{action_name}" if AppName::Application.assets.find_asset("#{controller_name}/#{action_name}") %>
cấu hình / khởi tạo / tài sản.rb :
config.assets.precompile += %w(*/*)
Sau đó, thêm một thư mục mới có cùng tên với bộ điều khiển của bạn trong thư mục tài sản / javascripts của bạn và đặt tệp js của bạn có cùng tên với hành động của bạn bên trong. Sau đó nó sẽ tải nó vào hành động cụ thể đó.