Использование вспомогательного метода Rails в активе javascript - PullRequest
69 голосов
/ 17 сентября 2011

Есть ли способ использовать вспомогательный метод Rails, точнее, вспомогательный метод пути в файле ресурсов javascript.Этот файл foo.js.coffee.erb

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

Мне бы очень понравилось, если бы я мог получить от erubis

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

Ответы [ 5 ]

74 голосов
/ 15 ноября 2011

Вы можете включить любой помощник / модуль / класс в шаблон erb с помощью:

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

См .: https://github.com/rails/sprockets/blob/master/lib/sprockets/environment.rb и https://github.com/rails/sprockets/blob/master/lib/sprockets/context.rb

Чтобы использовать помощники по URL, вы должны включить помощников ваших конкретных приложений.

Они доступны по адресу Rails.application.routes.url_helpers, поэтому:

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

РЕДАКТИРОВАТЬ: Исправлены ссылки на репо перемещенных звездочек, но не совсем уверен, что это все еще имеет смысл спустя много лет.

25 голосов
/ 12 декабря 2012

Это также поможет в инициализаторе:

Sprockets::Context.send :include, MyHelper

В режиме разработки помощник не будет перезагружаться при каждом запросе.

Ваш подход с UrlHelpers будет работать, пока вам не понадобитсянайти post_path(...um...we don't know what post id we'll need at compile time...).Существует рубиновый драгоценный камень, который переопределяет все ваши Rails UrlHelpers в JavaScript: https://github.com/railsware/js-routes

19 голосов
/ 19 сентября 2011

Я не совсем уверен, почему вы хотите это сделать.

  • Вы бы запретили кэширование файла javascript, поскольку он содержит динамическое значение

  • Вы бы получили связь между вашим javascript / coffeescriptи rails

Если возможно, я бы посоветовал вам абстрагироваться от вашей проблемы, указав целевой путь в представлении, и получить значение из DOM-элемента, когда происходит конкретное событие.Точно так же, как «ненавязчивые адаптеры сценариев» для Rails.Например: https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L157-173

8 голосов
/ 03 декабря 2014

Действительно, я согласен с ответом @eirc (с учетом документации Sprockets). Но я бы рассмотреть возможность включения вспомогательных модулей во время загрузки рельсов. Согласно

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

это из-за: https://github.com/rails/sprockets-rails/blob/master/lib/sprockets/railtie.rb#L23

5 голосов
/ 08 октября 2011

На самом деле, не уверен, помогает ли это, но есть способ определить ваших собственных помощников для использования во время rake precompile

Создайте новый инициализатор и вставьте в него:

module Sprockets
  module Helpers
    module RailsHelper

      def my_helper_method
       ...
      end

    end
  end
end

И тогда вы можете:

<%= my_helper_method %>

в ваших .erb активах

...