Tôi thích giải pháp của albandiguer . Tôi thấy rằng nội dung javascript / coffeescript không được biên dịch trước riêng lẻ. Nguyên nhân gây ra tất cả các loại lỗi khi cố gắng sử dụng javascript_path
. Tôi sẽ chia sẻ giải pháp của mình cho vấn đề đó sau khi tôi giải quyết vấn đề mà một vài người đã đề cập trong nhận xét của anh ấy. Chủ yếu chỉ xử lý một phần bộ điều khiển có tên tệp JavaScript.
Vì vậy, tôi đã xây dựng một trình trợ giúp ứng dụng để phát hiện xem tệp có tồn tại trong thư mục javascript bất kể phần mở rộng .coffee / .js hay không:
module ApplicationHelper
def javascript_asset_path(basename)
Sprockets::Rails::Helper.assets.paths.select{|i|
i =~ /javascript/ and i =~ /#{Rails.root}/
}.each do |directory|
if Dir.entries(directory).map {|i| i.split('.')[0]}.compact.
include? basename
return File.join(directory, basename)
end
end
nil
end
end
Phương thức này sẽ trả về đường dẫn đầy đủ đến tệp javascript nếu nó tồn tại. Nếu không, nó trả về nil. Vì vậy, sau nhận xét của Pencilcheck, bạn có thể thêm phương thức này cho một bao gồm có điều kiện:
<%= javascript_include_tag(controller_name) if javascript_asset_path(controller_name) %>
Và bây giờ bạn có một bao gồm có điều kiện thích hợp. Bây giờ là vấn đề về nội dung được biên dịch trước. Nói chung để tối ưu hóa, bạn không muốn các nội dung được biên dịch trước riêng lẻ. Tuy nhiên, bạn có thể làm điều đó nếu bạn phải:
config.assets.compile = true
Bạn có thể thêm điều này làm tệp cấu hình môi trường của bạn. Kiểm tra nó trong tệp môi trường phát triển của bạn trước. Một lần nữa điều này là không nên. Đường dẫn nội dung Rails sử dụng Sprockets để tối ưu hóa mọi thứ:
Sprockets tải các tệp được chỉ định, xử lý chúng nếu cần, nối chúng thành một tệp duy nhất và sau đó nén chúng (nếu Rails.application.config.assets.compress là true). Bằng cách phân phát một tệp thay vì nhiều tệp, thời gian tải của các trang có thể giảm đáng kể vì trình duyệt đưa ra ít yêu cầu hơn. Nén cũng làm giảm kích thước tệp, cho phép trình duyệt tải chúng xuống nhanh hơn.
VUI LÒNG ĐỌC tài liệu để biết thêm chi tiết về cơ chế của Sprockets (Đường ống tài sản) http://guides.rubyonrails.org/asset_pipeline.html
Nội dung không được biên dịch trước riêng lẻ. Ví dụ khi tôi thử:
<%= javascript_include_tag 'event' %>
Tôi có:
Sprockets :: Rails :: Helper :: AssetFilteredError: Nội dung bị lọc ra và sẽ không được phân phát: thêm Rails.application.config.assets.precompile +=
%w( event.js )
vào config/initializers/assets.rb
và khởi động lại máy chủ của bạn
Vì vậy, bạn có thể bao gồm các nội dung được biên dịch trước riêng lẻ. Chúng tôi chỉ cần thêm trình điều khiển có tên tệp javascript có liên quan vào trình khởi tạo nội dung của chúng tôi. Chúng ta có thể làm điều này theo chương trình.
Để có danh sách tên bộ điều khiển, tôi sẽ sử dụng ví dụ của ecoologic :
all_controllers = Dir[
Rails.root.join('app/controllers/*_controller.rb')
].map { |path|
path.match(/(\w+)_controller.rb/); $1
}.compact
Và bây giờ để lấy tên của tất cả các tệp javascript khớp với tên cơ sở của tên bộ điều khiển, bạn có thể sử dụng như sau:
javascripts_of_controllers = Sprockets::Rails::Helper.assets.paths.select{|a_path|
a_path =~ /javascript/ and a_path =~ /#{Rails.root}/
}.map {|a_path|
Dir.entries(a_path)
}.flatten.delete_if {|the_file|
!the_file['.js']
}.collect {|the_file|
the_file if all_controllers.any? {|a_controller| the_file[a_controller]}
}
Sau đó, bạn có thể thử:
Rails.application.config.assets.precompile += javascripts_of_controllers
Thao tác này sẽ giúp bạn có được danh sách tất cả các tệp javascript, không có đường dẫn thư mục, khớp với tên bộ điều khiển của bạn. Lưu ý nếu tên bộ điều khiển của bạn là số nhiều thì tên javascript cũng phải như vậy. Cũng lưu ý nếu bộ điều khiển là số ít và tệp javascript là số nhiều, điều này sẽ vẫn bao gồm nó vì the_file[a_controller]
sẽ thành công trên một phần đối sánh.
Hãy thử điều này trong Rails.application.config.assets.precompile
cài đặt của bạn . Tôi biết rằng điều này giúp bạn có được danh sách các tệp một cách chính xác. Nhưng tôi sẽ để bạn kiểm tra nó. Hãy cho tôi biết nếu có bất kỳ sắc thái nào liên quan đến việc biên dịch trước theo cách này khi tôi tò mò.
Để được giải thích cặn kẽ về cách biên dịch trước nội dung, hãy xem blog này: http://www.sitepoint.com/asset-precompile-works-part/