web-dev-qa-db-fra.com

Utilisation d'une méthode d'assistance Rails dans un actif javascript)

Existe-t-il un moyen d'utiliser une méthode d'assistance Rails, plus précisément une méthode d'assistance de chemin dans un fichier d'actif javascript. Ce fichier foo.js.coffee.erb

$('#bar').val("<%= create_post_path %>")

J'adorerais si je pouvais obtenir d'Erubis

$('#bar').val("path/to/create")
69
axsuul

Vous pouvez inclure n'importe quel assistant/module/classe dans un modèle erb avec:

<% environment.context_class.instance_eval { include MyHelper } %>

Voir: https://github.com/Rails/sprockets/blob/master/lib/sprockets/environment.rb et https://github.com/Rails/sprockets/blob /master/lib/sprockets/context.rb

Pour utiliser les assistants url, vous devez inclure les assistants de vos applications spécifiques.

Ils sont disponibles sur Rails.application.routes.url_helpers donc:

<% environment.context_class.instance_eval { include Rails.application.routes.url_helpers } %>

EDIT: liens fixes vers le repo des pignons déplacés, mais pas vraiment sûr que cela a encore du sens tant d'années plus tard.

74
eirc

Cela fera également l'affaire dans un initialiseur:

Sprockets::Context.send :include, MyHelper

En mode développement, l'assistant ne sera pas rechargé à chaque demande.

Votre approche avec UrlHelpers fonctionnera jusqu'à ce que vous ayez besoin de trouver post_path(...um...we don't know what post id we'll need at compile time...). Il y a un Ruby gem qui réimplémente tous vos Rails UrlHelpers en JavaScript: https://github.com/railsware/js-routes)

25
user1158559

Je ne sais pas trop pourquoi vous voulez faire ça.

  • Vous empêcheriez le fichier javascript d'être mis en cache, car il contient une valeur dynamique

  • Vous obtiendrez un couplage entre votre javascript/coffeescript et Rails

Si possible, je vous conseillerais de résumer votre problème en fournissant votre chemin cible dans la vue et de récupérer la valeur de l'élément DOM lorsque l'événement spécifique se produit. Tout comme les "adaptateurs de script discrets" pour Rails do. Par exemple: https://github.com/Rails/jquery-ujs/blob/master/src/Rails.js# L157-17

19
topek

En effet je suis d'accord avec la réponse @eirc (en tenant compte de la documentation Sprockets). Mais j'envisagerais d'inclure des modules d'assistance à Rails au démarrage. Selon

# config/initializers/sprockets.rb
Rails.application.assets.context_class.instance_eval do
  include ActionView::Helpers
  include Rails.application.routes.url_helpers
  include MyModule
end

c'est à cause de: https://github.com/Rails/sprockets-Rails/blob/master/lib/sprockets/railtie.rb#L2

8
Andrea Amantini

En fait, je ne sais pas si cela aide, mais il existe un moyen de définir vos propres assistants à utiliser pendant rake precompile

Créez un nouvel initialiseur et mettez-le dedans:

module Sprockets
  module Helpers
    module RailsHelper

      def my_helper_method
       ...
      end

    end
  end
end

Et puis vous pouvez:

<%= my_helper_method %>

dans ton .erb les atouts

5
Matthew