Использование вспомогательного метода 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
активы