将.js文件转换为Rails中的.js.erb文件有什么用?

时间:2011-10-19 12:53:21

标签: ruby-on-rails-3.1

我无法理解为什么要将扩展名.erb添加到app / assets文件夹中的普通.js文件中?这就是我想到这一点:

在我的应用程序中,我希望将一个js文件花费的http请求只包含在HTML页面/ DOM的主体中。我可以通过将js文件名(包含类似行)添加到application.js清单文件中来实现:

    //= require jquery
    //= require directory_name 
    //= require jQuery_plugins/carousel
    //= require jQuery_plugins/word-editor
    //= require jQuery_plugins/abc_something

等等。

现在我为整个rails应用程序提供了很长的javascripts列表,我希望清单文件以特定于页面的方式输出(包含)javascripts。为了解决这个问题,我尝试添加以下条件:

    if params[:controller] == "my_controller" && params[:action] == "index"
      //= require jQuery_plugins/carousel

我还将application.js转换为application.js.erb文件以查看是否有效。但不是!那没起效。清单将输出所有内容。看起来有一个问题是针对SOF上的类似问题提出的,但答案中给出的解决方案似乎非常古老而且相当不干净的传统方式。

Where-do-you-put-your-page-specific-javascript-code

那么,将js转换为js.erb文件的用途是什么?我可以纯粹基于“js manifest”文件来管理页面特定的输出吗?

2 个答案:

答案 0 :(得分:1)

所以,你有.js.erb所以你可以在你的js中嵌入ruby代码,这将被执行并输出js到文件的中间。也许答案太明显了。

您可能希望这样做的一个原因是使用asset_path帮助程序将路径嵌入到js字符串文字中的另一个应用程序资产中。我想想你也可以使用url_for或其他路由助手,比如将URL嵌入到JS字符串文字中的特定应用程序操作中。但我没有尝试过,每个通常的Rails辅助方法都可以在资产ERB中使用,只有一个子集,并且它们并不总是像通常的助手一样工作。

所做的是您最初提出的建议,嵌入以当前请求或当前页面为条件的ruby。这是因为资产管道中的资产没有为每个请求编译(即执行)(至少通常不在生产中),而是仅在应用程序的生命周期内编译一次并缓存 - 所以当时它们是编译和缓存,没有“当前”请求或页面或请求参数。

一般情况下,.js.erb可能不经常使用,它只是为了保持一致性,如果你需要它。可能还有其他一些奇怪的情况,即使不使用url helper方法,使用ruby代码在资产中生成JS代码也很方便。那么为什么不能让它变得可能,因为资产管道意味着资产无论如何都要经过一些处理/执行,如果你愿意,让你通过ERB发送em也是很自然的。

答案 1 :(得分:1)

我将它用于以下内容:

if (<%=j @tarea.errors[:texto].any?.to_s%>){
    $('#texto_tooltip').html("<%= @tarea.errors[:texto].first.to_s %>");
    $('#texto_field').addClass("error-box");
}

取决于对象状态,我可以执行一些jquery或其他