63

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

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

J'aimerais si je pouvais obtenir de erubis

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

Avez-vous essayé de le faire? Ça devrait marcher. – natedavisolds

+1

Oui, je l'ai essayé, il donne "variable locale non définie ou méthode". J'ai essayé d'autres méthodes telles que ... number_to_currency – axsuul

+0

Je voudrais noter que cette méthode d'aide fonctionne bien: javscript_path ('path/to/js') – axsuul

Répondre

68

Vous pouvez inclure toute aide/module/classe dans un modèle de 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 aides d'URL que vous devez inclure les aides de vos applications spécifiques.

Ils sont disponibles à Rails.application.routes.url_helpers si:

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

EDIT: liens fixes à pignons déplacés repo mais sûrement pas vraiment ce qui rend encore un sens tant d'années plus tard.

+0

Mais comment inclueriez-vous le module UrlHelpers? Et la mauvaise chose avec cela est que les assistants url ont besoin d'un modèle à l'exécution, acheter-acheter cow-boy –

+14

Pour utiliser les aides url, vous devez inclure les aides 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}%> ' – eirc

+3

Réponse fantastique! Comment avez-vous compris cela? Est-ce présent sur les Guides Rails? Je pensais avoir peut-être vu quelque chose de similaire dans un RailsCast, cette magie est si puissante, tu dois me dire mec! – jlstr

18

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

  • Vous empêcher 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 Nous vous conseillons de résumer votre problème en fournissant votre chemin cible dans la vue et d'extraire la valeur de l'élément DOM lorsque l'événement spécifique se produit. Tout comme les «adaptateurs de script discrets» pour Rails. Par exemple: https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L157-173

+0

Oui, merci pour la suggestion. – axsuul

+19

cela n'empêcherait pas la mise en cache. les assets sont compilés lors du déploiement et ne changent jamais ce chemin (à moins qu'il ne le fasse réellement et que les assets soient recompilés) ceci est particulièrement utile si, disons, vous voulez utiliser un chemin d'image dans votre JS hébergé depuis votre 'asset_path ' – brad

+4

Comme mentionné ci-dessus, je ne voudrais pas faire cela, car il introduit le couplage entre votre application et votre JavaScript. Chaque partie de votre application doit servir un objectif différent. Vous ne voudriez pas que votre vue ait une logique de modèle et personnellement je ne veux pas que le code de Rails fuit dans mon JavaScript. Bien sûr, c'est une sorte de préférence personnelle. JavaScript a de nombreuses possibilités pour extraire des informations du DOM sans y être directement injecté. Vous ne voudriez pas coder ces valeurs en dur. Alors pourquoi serait-il préférable d'avoir une aide pour vous? – topek

5

En fait, pas sûr que cela aide, mais il y a un moyen de définir vos propres aides à utiliser pendant rake precompile

Créer une nouvelle initialiseur et mettre cela en elle:

module Sprockets 
    module Helpers 
    module RailsHelper 

     def my_helper_method 
     ... 
     end 

    end 
    end 
end 

Et alors vous pouvez:

<%= my_helper_method %> 

dans vos .erb actifs

25

Cela permettra également faire l'affaire dans un initialiseur:

Sprockets::Context.send :include, MyHelper 

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

Votre approche avec UrlHelpers fonctionnera jusqu'à ce que vous deviez trouver post_path(...um...we don't know what post id we'll need at compile time...). Il y a une gemme ruby ​​qui réimplante tous vos UrlHelpers Rails en JavaScript: https://github.com/railsware/js-routes

+0

C'est la solution la moins intrusive, merci! – Casey

+1

J'ai dû ajouter un railtie à mon fichier application.rb depuis que j'utilisais config.assets.initialize_on_precompile = false https://stackoverflow.com/questions/9235292/how-can-i-run-some-initializers-when-doing-a-rails-assetsprecompile/12700183#12700183 on comment mettre en place le railtie – HannesBenson

+0

Cela a fonctionné pour moi, merci. –

8

En effet je suis d'accord avec la réponse @eirc (en tenant compte de la documentation Sprockets). Mais je voudrais envisager d'inclure des modules auxiliaires au temps de démarrage des rails.Comme par

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

cela est dû: https://github.com/rails/sprockets-rails/blob/master/lib/sprockets/railtie.rb#L23

Questions connexes