在JavaScript资产中使用Rails辅助方法


70

有没有办法使用Rails辅助方法,更具体地说,是JavaScript资产文件中的路径辅助方法。这个文件foo.js.coffee.erb

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

如果可以从erubis获得,我会喜欢的

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

您是否尝试过这样做?它应该工作。
natedavisolds 2011年

1
是的,我尝试过,它给出了“未定义的局部变量或方法”。我尝试了其他方法,例如... number_to_currency
axsuul 2011年

我想指出,此辅助方法确实有效:javscript_path('path / to / js')
axsuul 2011年

Answers:


76

您可以在erb模板中包含以下任何帮助器/模块/类:

<% environment.context_class.instance_eval { include MyHelper } %>

看到: https //github.com/rails/sprockets/blob/master/lib/sprockets/environment.rbhttps://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 } %>

编辑:固定链接到已移动的链回购,但不确定多年后仍然有意义。


但是,您将如何包含UrlHelpers模块?坏处在于,URL助手需要在运行时建立模型,购买牛仔
Nikos D

14
要使用url帮助程序,您必须包括特定应用程序的帮助程序。它们的可用Rails.application.routes.url_helpers<% environment.context_class.instance_eval { include Rails.application.routes.url_helpers } %>
网址

3
很棒的答案!您是如何知道的?在Rails指南中有吗?我以为我可能在RailsCast中看到了类似的东西,这种魔力是如此强大,您必须告诉我!
jlstr 2012年

1
不确定我是如何提出的,或者通过在Rails代码中导航(IntelliJ IDE(jetbrains.com/idea)使这一切变得非常容易)或通过在调试模式下运行(再次赞扬IDE :)
eirc 2012年

github链接返回404 :(
pedrorijo91

27

这也将在初始化程序中达到目的:

Sprockets::Context.send :include, MyHelper

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

您需要使用UrlHelpers进行处理,直到找到为止post_path(...um...we don't know what post id we'll need at compile time...)。有一个红宝石,可以在JavaScript中重新实现所有Rails UrlHelpers:https//github.com/railsware/js-routes


1
自从我使用config.assets.initialize_on_precompile = false以来,我不得不在我的application.rb文件中添加一个领结。stackoverflow.com/questions/9235292/…有关如何设置导轨的信息。
HannesBenson 2014年

19

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

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

  • 您将在javascript / coffeescript和rails之间建立耦合

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


20
这不会阻止缓存。资产在部署时进行编译,并且永不更改,路径不会更改(除非它实际上不会更改,并且资产会重新编译),如果说您想在由asset_path
brad

4
如上所述,我不想这样做,因为它在您的应用程序和JavaScript之间引入了耦合。应用程序的每个部分都应达到不同的目的。您不希望视图具有模型逻辑,而且我个人不希望Rails代码泄漏到我的JavaScript中。当然,这是个人喜好。JavaScript具有许多从DOM检索信息而无需直接注入DOM的可能性。您不想对这些值进行硬编码。那么,为什么有个帮手为您做会更好呢?
topek

github链接最初指向代码的最初位置是什么?拥有指向“ master”分支的链接会使它们在一段时间后难以跟随。
valscion 2013年


5

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

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

module Sprockets
  module Helpers
    module RailsHelper

      def my_helper_method
       ...
      end

    end
  end
end

然后您可以:

<%= my_helper_method %>

在您的.erb资产中

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.