Non dovresti caricare i tuoi file JS o CSS al di fuori della pipeline degli asset perché perdi funzioni importanti che rendono Rails così eccezionale. E non hai bisogno di un'altra gemma. Credo nell'utilizzare il minor numero possibile di gemme e non è necessario utilizzare una gemma qui.
Quello che vuoi è noto come "Javascript specifico del controller" ("Javascript specifico dell'azione è incluso nella parte inferiore). Ciò ti consente di caricare un file JavaScript specifico per un CONTROLLER specifico. Cercare di connettere il tuo Javascript a una vista è un po '.. indietro e non segue il modello di progettazione MVC. Si desidera associarlo ai controller o azioni all'interno dei controller.
Sfortunatamente, per qualsiasi motivo, gli sviluppatori di Rails hanno deciso che, per impostazione predefinita, ogni pagina caricherà ogni file JS situato nella directory delle risorse. Perché non abbiano mai deciso di farlo invece di abilitare "Javascript specifico del controller" per impostazione predefinita. Questo viene fatto tramite il file application.js, che include la seguente riga di codice per impostazione predefinita:
//= require_tree .
Questo è noto come direttiva . È ciò che utilizza i pignoni per caricare ogni file JS nella directory assets / javascripts. Per impostazione predefinita, i pignoni caricano automaticamente application.js e application.css e la direttiva require_tree carica tutti i file JS e Coffee nelle rispettive directory.
NOTA: quando impalcature (se non si tratta di impalcature, ora è un buon momento di iniziare), Rails genera automaticamente un file di caffè per te, per il controller di quell'impalcatura. Se vuoi che generi un file JS standard invece di un file di caffè , rimuovi la gemma di caffè abilitata di default nel tuo Gemfile e il tuo scaffold creerà invece file JS.
Ok, quindi il primo passo per abilitare "Javascript specifico del controller" è rimuovere il codice require_tree dal tuo file application.js, O cambiarlo in una cartella nella tua cartella assets / javascripts se hai ancora bisogno di file JS globali. IE:
//= require_tree ./global
Passaggio 2: accedi al tuo file config / initializer / assets.rb e aggiungi quanto segue:
%w( controllerone controllertwo controllerthree ).each do |controller|
Rails.application.config.assets.precompile += ["#{controller}.js", "#{controller}.css"]
end
Inserisci i nomi dei controller che desideri.
Passaggio 3: Sostituisci javascript_include_tag nel tuo file application.html.erb con questo (nota la parte params [: controller]:
<%= javascript_include_tag 'application', params[:controller], 'data-turbolinks-track': 'reload' %>
Riavvia il tuo server e viola! Il file JS che è stato generato con il tuo scaffold ora verrà caricato solo quando viene chiamato quel controller.
Devi caricare un file JS specifico su una specifica AZIONE nel tuo controller , IE / articoli / nuovo ? Fallo invece:
application.html.erb :
<%= javascript_include_tag "#{controller_name}/#{action_name}" if AppName::Application.assets.find_asset("#{controller_name}/#{action_name}") %>
config / initializer / assets.rb :
config.assets.precompile += %w(*/*)
Quindi aggiungi una nuova cartella con lo stesso nome del tuo controller nella cartella assets / javascripts e inserisci il tuo file js con lo stesso nome della tua azione. Lo caricherà quindi su quell'azione specifica.