在Rails中为特定页面放置JS文件的位置?

时间:2013-11-15 21:12:39

标签: jquery ruby-on-rails ruby-on-rails-4 asset-pipeline

我正在使用带有一些选项的自动完成JQuery插件。小代码仅用于一个特定的页面。

我的第一次尝试是将它放在app/assets/javascripts/foo.js中的一个单独的JS文件中。问题是代码抛出异常,因为该元素在其他页面中不存在。

我还考虑过从特定页面调用JS文件,但是我应该把这个JS文件放在哪里?

编辑1

这是foo.js的代码

$(document).ready(function(){
    $("#search").autocomplete({
         // set options
    }) 
    .data( "ui-autocomplete" )._renderItem = 
        function( ul, item ) {
        // more code
        };
});

我在firebug中获得了typeerror $(...).autocomplete(...).data(...) is null,所以我尝试将此代码放入<script></script>的特定页面并且工作正常,但我不喜欢这种方法。

2 个答案:

答案 0 :(得分:1)

您需要将此文件放在资产管道之外,即不在app/assetslib/assetspublic/assets内。您可以将其放在public文件夹中,然后在您需要的视图中使用javascript_include_tag链接到该文件夹​​。

答案 1 :(得分:0)

有几种方法可以解决这个问题。可能最简单的方法是将所有相关的js直接放在它关注的页面中 - 只需添加一个脚本标记,将其放入其中,然后完成它。

我不是这种方法的忠实粉丝,并不适用于所有情况。我要继续猜测在assets/javascripts,你有一个“require_tree”。结合了&amp;提供文件夹中的每个文件。您可以做的是稍微分解一下 - 将每个页面上服务的每个文件保存在特定的单独文件夹中,并要求该文件夹中的每个文件。将foo.js之类的内容保存在其他位置,并根据需要组合/提供它们。

我不能肯定地说,但我猜这种JavaScript文件的划分将是矫枉过正的。我认为最好的办法是改变foo.js的结构,这样你仍然可以用其他一切来提供它,但它不会自动运行。有几种方法可以做到这一点。一种方法是将所有内容包装在一个命名函数中,并在需要它的特定页面上调用该函数。


但是,如果问题只是配置jQuery插件,那么您可以更多地依赖jQuery来实现这一点。我必须看到有问题的代码,但你能够在空集上调用插件。

例如,如果您正在使用jQuery-ui并将某些内容声明为可拖动,则$("#my_element").draggable()如果页面上不存在“#my_element”则不会导致异常 - 相反,什么都不会发生。我不能肯定地说没有看到你正在做什么,但我敢打赌,你可以通过foo.js的巧妙重组,让它无害地存在于不需要它的页面上。


关于修改1

一个简单的,如果有点噱头,修复只会这样做:

$(document).ready(function(){
  $("#search").autocomplete({
     // set options
  })
  .each(function() {
    $(this).data('ui-autocomplete')._renderItem = 
      function( ul, item ) {
      // more code
      };
  });

我不太了解jQuery UI小部件,知道是否有更好的方法 - 理想情况下,有一些方法可以将_renderItem函数作为自动完成配置的一部分。我要做更多的挖掘,但除此之外,这是一种合理的方式。