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

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

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

Я был бы рад, если бы я мог получить от Erubis

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

5 ответов

Решение

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

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

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

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

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

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

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

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

Действительно, я согласен с ответом @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

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

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

module Sprockets
  module Helpers
    module RailsHelper

      def my_helper_method
       ...
      end

    end
  end
end

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

<%= my_helper_method %>

в вашем .erb активы

Другие вопросы по тегам