Ich mag die Lösung von Albandiguer . Womit ich festgestellt habe, dass Javascript / Coffeescript-Assets nicht einzeln vorkompiliert werden. Was bei der Verwendung allerlei Fehler verursacht javascript_path
. Ich werde meine Lösung für dieses Problem mitteilen, nachdem ich ein Problem angesprochen habe, das einige Leute in seinen Kommentaren erwähnt haben. Hauptsächlich wird nur ein Teil des Controllers mit dem Namen JavaScript-Dateien behandelt.
Daher habe ich einen Anwendungshelfer erstellt, um festzustellen, ob die Datei unabhängig von der Erweiterung .coffee / .js im Javascript-Verzeichnis vorhanden ist:
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
Diese Methode gibt den vollständigen Pfad zur Javascript-Datei zurück, falls vorhanden. Andernfalls wird null zurückgegeben. Nach dem Kommentar von Pencilcheck können Sie diese Methode für ein bedingtes Include hinzufügen:
<%= javascript_include_tag(controller_name) if javascript_asset_path(controller_name) %>
Und jetzt haben Sie eine richtige bedingte Aufnahme. Nun zur Ausgabe vorkompilierter Assets. Im Allgemeinen möchten Sie zur Optimierung keine Assets einzeln vorkompilieren . Sie können es jedoch tun, wenn Sie müssen:
config.assets.compile = true
Sie können dies in Ihrer Umgebungskonfigurationsdatei hinzufügen. Testen Sie es zuerst in Ihrer Entwicklungsumgebungsdatei. Auch dies ist nicht ratsam. Die Rails-Asset-Pipeline verwendet Sprockets, um alles zu optimieren:
Sprockets lädt die angegebenen Dateien, verarbeitet sie bei Bedarf, verkettet sie zu einer einzigen Datei und komprimiert sie dann (wenn Rails.application.config.assets.compress true ist). Durch das Bereitstellen einer Datei anstelle mehrerer Dateien kann die Ladezeit von Seiten erheblich reduziert werden, da der Browser weniger Anforderungen stellt. Durch die Komprimierung wird auch die Dateigröße reduziert, sodass der Browser sie schneller herunterladen kann.
BITTE LESEN Sie die Dokumentation, um weitere Einzelheiten zur Mechanik von Kettenrädern (Asset Pipeline) zu erfahren. Http://guides.rubyonrails.org/asset_pipeline.html
Assets werden nicht einzeln vorkompiliert. Zum Beispiel, wenn ich versuche:
<%= javascript_include_tag 'event' %>
Ich bekomme:
Pinion :: Rails :: Helper :: AssetFilteredError: Vermögensherausgefiltert und wird nicht bedient werden: add Rails.application.config.assets.precompile +=
%w( event.js )
an config/initializers/assets.rb
und starten Sie Ihren Server
So können Sie angeben, welche Assets einzeln vorkompiliert werden sollen. Wir müssen nur den entsprechenden Controller mit dem Namen Javascript-Dateien in unseren Asset-Initialisierer einfügen. Nun, wir können dies programmatisch tun.
Um eine Liste der Controllernamen zu erhalten, verwende ich das Beispiel von ecoologic :
all_controllers = Dir[
Rails.root.join('app/controllers/*_controller.rb')
].map { |path|
path.match(/(\w+)_controller.rb/); $1
}.compact
Um nun den Namen aller Javascript-Dateien zu erhalten, die mit dem Basisnamen des Controllernamens übereinstimmen, können Sie Folgendes verwenden:
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]}
}
Dann können Sie versuchen:
Rails.application.config.assets.precompile += javascripts_of_controllers
Dadurch erhalten Sie eine Liste aller Javascript-Dateien ohne Verzeichnispfad, die Ihrem Controllernamen entsprechen. Beachten Sie, wenn Ihr Controller-Name Plural ist, sollte auch der Javascript-Name sein. Beachten Sie auch, dass wenn der Controller singulär ist und die Javascript-Datei Plural ist, diese weiterhin enthalten ist, da the_file[a_controller]
eine teilweise Übereinstimmung erfolgreich ist.
Probieren Sie dies einfach in Ihrer Rails.application.config.assets.precompile
Umgebung aus. Ich weiß, dass Sie dadurch die Liste der Dateien korrekt erhalten. Aber ich überlasse es Ihnen, es zu testen. Lassen Sie mich wissen, ob das Vorkompilieren auf diese Weise Nuancen mit sich bringt, da ich neugierig bin.
Eine sehr ausführliche Erklärung zur Vorkompilierung von Assets finden Sie in diesem Blog: http://www.sitepoint.com/asset-precompile-works-part/