Использование вспомогательного метода Rails в ресурсе javascript
Существует ли какой-либо способ использования вспомогательного метода Rails, а более конкретно, метода помощника пути в файле активов javascript. Этот файл foo.js.coffee.erb
$('#bar').val("<%= create_post_path %>")
Мне бы это понравилось, если бы я мог получить от erubis
$('#bar').val("path/to/create")
Ответы
Ответ 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