由于JS库错误,Javascript无法在Production Rails页面上运行?

时间:2013-05-05 20:40:42

标签: javascript ruby-on-rails asset-pipeline

我有一些简单的javascript来隐藏和显示我的网页上的文本块,以前工作正常。我最近在assets / javascripts中放置了一个新的javascript库,以便在我的网站上创建其他视觉效果。它工作正常,但现在我的简单的JavaScript不再在线工作,虽然它仍然在本地工作。 Chrome控制台会显示来自库的错误消息(“Uncaught ReferenceError:Raphael未定义”)。

这是否会阻止我的其他javascript在生产服务器上工作,但不能在我的本地开发服务器上工作?如何防止资产中的库加载到其他页面上,这样就不会破坏所有内容?

1 个答案:

答案 0 :(得分:1)

是的,这可能会破坏你的其余代码。当您在生产中运行rails时,如果您已经使用了sprokets并将所有内容都需要到application.js中,那么它将被处理为单个文件。如果在该文件中的任何一点javascript代码失败,它将打破文件的其余部分(这非常烦人)

您可以有条件地包含我认为您已经在做错误的raphael库,但是在您的javascript代码中,您还可以检查它是否已定义。我要做的是围绕使用Raphael的代码,使用类似的东西:

if (typeof Raphael !== "undefined") {
    ... Raphael code goes here...
}

这样,如果未加载库,则无关紧要,您的代码也不会中断,如果加载了,那么您的Raphael特定代码将正常运行:)

更多信息

我也将Raphael库移到供应商目录中。这更有意义,因为这是专门针对您自己未添加/创建的资产。

rails现在自动加载Raphael的原因很可能是由于application.js的默认配置。默认情况下,rails使用

设置它
//= require_tree .

这将包括资产目录中的所有JS文件,这是正常的,但如果你想有条件地包含文件,那就更难尴尬了。

如果你希望它基于每页的条件,你可以改变你的application.html布局来添加一个新的JS包含,只有在被告知时才会包含raphael库(通过一个变量或一些其他机制)

如果您添加以下内容:

<%= javascript_include_tag("raphael") if @raphael %>

显然将raphael更改为库文件的名称实际上是什么,然后只有@raphael变量为true时才包含raphael。您可以在控制器或视图顶部的任何位置进行设置,甚至可以在视图中调用的视图助手中进行设置。完全取决于你