2014-06-09 55 views
0

我试图做这样的事情在我application.js.coffee清单文件添加页面的特定JS 4.0.1

#= require jquery.min 
#= require jquery.turbolinks 
#= require jquery_ujs 
#= require private_pub 
#= require turbolinks 
#= require ckeditor/init 
#= require bootstrap 


$ -> 
    if $('body').hasClass 'page' 
    #= require jquery.parallax-1.1.3 
    #= require jquery.scrollTo.min 
    #= require jquery.easing.1.3 
    #= require waypoints.min 
    #= require jquery.mousewheel 
    #= require jpreLoader 
    #= require custom 
    #= require maps 
    #= require jquery.flexisel 

    else 
    #= require jquery.slimscroll.min 
    #= require morris 
    #= require lanceng 
    #= require editable/bootstrap-editable 
    #= require editable/rails 
    #= require jquery.countdown 

这是不正确?我想添加页面特定的JS,我相信我也在主体类中添加了<%= controller_name %>,这是我用于页面特定CSS的方法。

然而,在我的源代码,我只能看到以下内容:

<!-- Javascript --> 

<script data-turbolinks-track="true" src="/assets/jquery.min.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.turbolinks.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery_ujs.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/private_pub.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/turbolinks.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/ckeditor/init.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/ckeditor/ckeditor.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/bootstrap.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/application.js?body=1"></script> 

是这种方法不正确?如果不是那么做的方法是什么?

回答

1

不幸的是你看到的问题是,因为清单(在require语句)评估服务器端。所以你的javascript if语句不会过滤或阻止任何加载,因为目标JS文件已经被加载。事实上,如果您在浏览器中查看呈现的application.js,您可能会看到一个空的if块。

有几种方法可以做到这一点(我知道)。如果你看一看滑轨资产管道引导Controller-Specific Assets,它建议:

...包括控制器特定样式表和 JavaScript文件只有在使用 各自的控制器以下:

<%= javascript_include_tag params[:controller] %> 
or 
<%= stylesheet_link_tag params[:controller] %> 

在执行此操作时,请确保您未使用require_tree指令 ,因为这会导致您的资产被多次包含。

此外,一个同事一直在使用称为Paloma的宝石正是为了这个目的。我没有自己使用它,所以我不能给你直接的建议或示例,但是我提到它,因为它似乎有助于简化不仅控制器特定的负载,而且还特定于操作的资产。

3

#= require语句是在服务器端运行proprocessors你的代码的网页上运行,因此之前甚至没有jQuery的准备$ ->功能将工作这就是为什么你没有看到任何的要求有包含在页面上。

我将不得不在这里停下来,只是说要让Rails资产管道连接并将您的javascript资源缩小为一个文件并一次全部提供,而不是让每个页面加载不同JavaScript文件。原因是用户下载1个大文件并缓存它比每个请求下载多个文件要好。这在移动平台上尤其如此。我强烈建议重新考虑你的策略。

延伸阅读:

+1

好吧,我明白了......我选择了这种策略,并且完全适合。 http://guides.rubyonrails.org/asset_pipeline.html#controller-specific-assets非常感谢你的帮助! –

相关问题