Używanie metody pomocniczej Rails wewnątrz zasobu javascript

Czy Jest jakiś sposób na użycie metody pomocniczej Rails, a dokładniej metody pomocniczej path w pliku zasobu javascript. Ten plik foo.js.coffee.erb

$('#bar').val("<%= create_post_path %>")
Chciałbym dostać od erubisa.]}
$('#bar').val("path/to/create")
Author: axsuul, 2011-09-17

5 answers

Możesz umieścić dowolny helper / moduł / klasę w szablonie erb z:

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

Zobacz: https://github.com/rails/sprockets/blob/master/lib/sprockets/environment.rb i https://github.com/rails/sprockets/blob/master/lib/sprockets/context.rb

Aby używać helperów url, musisz dołączyć helpery konkretnych aplikacji.

Są dostępne w Rails.application.routes.url_helpers więc:

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

EDIT: poprawione linki do przeniesionych zębatek repo ale nie jestem pewien czy to jeszcze to ma sens wiele lat później.

 70
Author: eirc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-12 13:29:43

To również zadziała w inicjalizatorze:

Sprockets::Context.send :include, MyHelper

W trybie deweloperskim helper nie będzie przeładowywany na każde żądanie.

Twoje podejście do UrlHelpers będzie działać, dopóki nie będziesz musiał znaleźć post_path(...um...we don't know what post id we'll need at compile time...). Istnieje klejnot ruby, który reimplementuje wszystkie Twoje Rails UrlHelpers w JavaScript: https://github.com/railsware/js-routes

 25
Author: user1158559,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-12 14:35:54

Nie jestem do końca pewien, dlaczego chcesz to zrobić.

  • Plik javascript nie będzie buforowany, ponieważ zawiera dynamiczną wartość

  • Możesz uzyskać połączenie między Twoim javascript / coffeescript i rails

Jeśli to możliwe, radziłbym Ci usunąć problem, podając ścieżkę docelową w widoku i pobierając wartość z elementu DOM, gdy wystąpi określone zdarzenie. Podobnie jak "dyskretne Adaptery Skryptowe" dla Rails zrobić. Np.: https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L157-173

 18
Author: topek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-18 20:24:01

Rzeczywiście zgadzam się z odpowiedzią @eirc (biorąc pod uwagę dokumentację kół zębatych). Ale ja bym rozważ włączenie modułów pomocniczych w czasie rozruchu rails. Zgodnie z

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

Wynika to z: https://github.com/rails/sprockets-rails/blob/master/lib/sprockets/railtie.rb#L23

 8
Author: Andrea Amantini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-03 10:16:40

Właściwie, Nie wiem, czy to pomaga, ale istnieje sposób, aby zdefiniować własne helpery do użycia podczas rake precompile

Utwórz nowy inicjalizator i umieść w nim to:

module Sprockets
  module Helpers
    module RailsHelper

      def my_helper_method
       ...
      end

    end
  end
end

I wtedy możesz:

<%= my_helper_method %>

W Twoim .erb majątku

 5
Author: Matthew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-01 20:09:25