76 votes

Rails 3.1 asset pipeline: comment charger le contrôleur de scripts spécifiques?

Si je créer un nouveau contrôleur dans les Rails 3.1, également un fichier javascript avec le nom du contrôleur sera ajouté automatiquement. Tout d'abord, j'ai pensé que ce fichier javascript sera utilisée uniquement, que le contrôleur est appelé.

Par défaut, il est l'instruction //= require_tree . dans la application.js-fichier, qui incluent tous les fichier javascript sur son arbre.

Comment pourrais-je charger uniquement le contrôleur de script spécifique?

122voto

Nguyen Chien Cong Points 1048

Pour charger uniquement le nécessaire name_of_the_js_file.js fichier:

  1. supprimer l' //=require_tree de application.js

  2. gardez votre fichier js (que vous voulez charger quand une page spécifique est chargé) dans l'asset pipeline

  3. ajouter un accompagnateur en application_helper.rb

    def javascript(*files)
      content_for(:head) { javascript_include_tag(*files) }
    end
    
  4. le rendement à votre disposition:

    <%= yield(:head) %>
    
  5. ajouter ceci dans votre fichier de vue:

    <% javascript 'name_of_the_js_file' %>
    

Ensuite, il devrait être ok

83voto

albandiguer Points 790

Une solution élégante consiste à exiger nom_controller dans votre javascript_include_tag

voir http://apidock.com/rails/ActionController/Metal/controller_name/class

<%= javascript_include_tag "application", controller_name %>

controller_name.js sera chargé et est à l'actif, de sorte que vous pouvez exiger d'autres fichiers à partir d'ici.

Exemple, le rendu des voitures#indice de donner

<%= javascript_include_tag "application", "cars" %>

où cars.js peut contenir

//= require wheel
//= require tyre

Profitez-en !

28voto

Le Duc Duy Points 623

J'ai toujours comporter à l'intérieur de mes fichiers de mise en page. Il permet à votre js à l'action

<%= javascript_include_tag params[:controller] if AppName::Application.assets.find_asset("#{params[:controller]}.js") %>
<%= javascript_include_tag "#{params[:controller]}_#{params[:action]}"  if AppName::Application.assets.find_asset("#{params[:controller]}_#{params[:action]}.js") %>

6voto

Robin Points 1820

Votre problème peut être résolu de différentes manières.

Ajouter les actifs de façon dynamique

Veuillez prendre en compte que ce n'est pas une bonne solution pour le mode de production, parce que votre contrôleur de détails ne seront pas précompilés!

  1. Ajouter à notre application helper la méthode suivante:

    module ApplicationHelper
        def include_related_asset(asset)
        #          v-----{Change this}
            if !YourApp::Application.assets.find_asset(asset).nil?
                case asset.split('.')[-1]
                    when 'js'
                        javascript_include_tag asset
                    when 'css'
                        stylesheet_link_tag asset
                end
            end
        end
    end
    
  2. Appel de la méthode d'assistance dans votre layoutfichier:

    <%= include_related_asset(params[:controller].to_param + '_' + params[:action].to_param . 'js') %>
    
  3. Créer des actifs spécifiques pour vos actions de contrôleur. E. g. controller_action.js

S'il vous plaît n'oubliez pas de changement YourApp pour le nom de votre application.

Utiliser yield

  1. Ajouter <%= yield :head%> de votre mise en page de la tête
  2. Inclure votre actif de votre action:

    <% content_for :head do %>
    <%= javascript_include_tag 'controller_action' %>
    <% end %>
    

Veuillez voir les Rails guides pour de plus amples informations.

3voto

peresleguine Points 810

Une autre option est d'utiliser pluggable_js gem.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X