Подтвердить что ты не робот

Использование вспомогательного метода Rails в ресурсе javascript

Существует ли какой-либо способ использования вспомогательного метода Rails, а более конкретно, метода помощника пути в файле активов javascript. Этот файл foo.js.coffee.erb

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

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

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

Ответ 1

Вы можете включить любой хелпер/модуль/класс в шаблон 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 } %>

EDIT: Исправлены ссылки на перемещение sprockets repo, но на самом деле не было уверен, что это все еще имеет смысл так много лет спустя.

Ответ 2

Это также сделает трюк в инициализаторе:

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

Ответ 3

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

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

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

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

Ответ 4

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

# 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

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

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

module Sprockets
  module Helpers
    module RailsHelper

      def my_helper_method
       ...
      end

    end
  end
end

И затем вы можете:

<%= my_helper_method %>

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