70 votes

Utilisation d'une méthode d'aide Rails dans une ressource javascript

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

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

J'aimerais beaucoup pouvoir obtenir d'erubis

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

77voto

eirc Points 816

Vous pouvez inclure n'importe quel helper/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 y https://github.com/rails/sprockets/blob/master/lib/sprockets/context.rb

Pour utiliser les aides d'url, vous devez inclure les aides de vos applications spécifiques.

Ils sont disponibles à l'adresse suivante Rails.application.routes.url_helpers donc :

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

EDIT : Correction des liens vers le dépôt de pignons déplacés, mais je ne suis pas vraiment sûr que cela ait encore un sens tant d'années plus tard.

27voto

user1158559 Points 1246

Cela fera également l'affaire dans un initialisateur :

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 existe une gemme ruby qui réimplémente tous vos UrlHelpers Rails en JavaScript : https://github.com/railsware/js-routes

19voto

topek Points 8288

Je ne suis pas tout à fait sûr, pourquoi vous voulez faire ça.

  • Vous empêchez la mise en cache du fichier javascript, car il contient une valeur dynamique.

  • Vous obtiendrez un couplage entre votre javascript/coffeescript et rails.

Si possible, je vous conseille d'abstraire 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 le font les 'Unobtrusive Scripting Adapters' pour Rails. Par exemple : https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L157-173

8voto

Andrea Amantini Points 81

En effet, je suis d'accord avec la réponse de @eirc (en tenant compte de la documentation de Sprockets). Mais j'envisagerais envisager d'inclure les modules d'aide au moment du démarrage de rails. D'après

# 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#L23

5voto

Matthew Points 4695

En fait, je ne sais pas si cela peut vous aider, mais il existe un moyen de définir vos propres aides à utiliser lors de l'utilisation de l'application rake precompile

Créez un nouvel initialisateur et mettez-y ceci :

module Sprockets
  module Helpers
    module RailsHelper

      def my_helper_method
       ...
      end

    end
  end
end

Et puis tu peux :

<%= my_helper_method %>

dans votre .erb actifs

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