70

有什么方法可以使用 Rails 辅助方法,更具体地说,是 javascript 资产文件中的路径辅助方法。这个文件foo.js.coffee.erb

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

如果我能从 erubis 得到它,我会喜欢的

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

5 回答 5

77

您可以在 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 } %>

编辑:固定链接到移动链轮回购但不确定这在这么多年后仍然有意义。

于 2011-11-15T09:04:55.813 回答
27

这也将在初始化程序中发挥作用:

Sprockets::Context.send :include, MyHelper

在开发模式下,助手不会在每个请求上重新加载。

您使用 UrlHelpers 的方法将一直有效,直到您需要找到post_path(...um...we don't know what post id we'll need at compile time...). 有一个 ruby​​ gem 可以在 JavaScript 中重新实现所有 Rails UrlHelpers:https ://github.com/railsware/js-routes

于 2012-12-12T14:35:54.143 回答
19

我不太确定,你为什么要这样做。

  • 您将阻止 javascript 文件被缓存,因为它包含动态值

  • 你会在你的 javascript/coffeescript 和 rails 之间得到一个耦合

如果可能的话,我建议您通过在视图中提供目标路径并在特定事件发生时从 DOM-Element 检索值来抽象出您的问题。就像 Rails 的“Unobtrusive Scripting Adapters”一样。例如:https ://github.com/rails/jquery-ujs/blob/master/src/rails.js#L157-173

于 2011-09-18T20:24:01.783 回答
8

事实上,我同意@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

于 2014-12-03T10:09:53.853 回答
5

实际上,不确定这是否有帮助,但有一种方法可以定义您自己的助手以供在rake precompile

创建一个新的初始化程序并将其放入其中:

module Sprockets
  module Helpers
    module RailsHelper

      def my_helper_method
       ...
      end

    end
  end
end

然后你可以:

<%= my_helper_method %>

在你的.erb资产中

于 2011-10-08T10:02:48.467 回答