Rails 3.1:javascripts从供应商/资产目录无法正确提供?

时间:2011-09-26 09:11:45

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

我已经在几个目录中组织了我的javascript文件,我发现了以下奇怪的行为。鉴于以下树:

+ app
  + assets
    + javascripts
      + common
      + public
        + common
        + home
          - home.js

home.js看起来像这样:

//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require_directory ../../jquery_plugins
//= require_directory ../../common
//= require_directory ../common
//= require_self

现在诀窍在于jquery_plugins目录。我把它放在vendor/assets/javascripts里面(当我检查Rails.application.config.assets.paths时,它包含在资产加载路径中)。当我这样做时,我收到错误:require_tree argument must be a directory。当我将该目录移动到app/assets/javascripts时,一切正常。

有没有人知道我做错了什么?或者这是一个错误吗?

2 个答案:

答案 0 :(得分:27)

您可以将清单文件添加到您尝试提供的目录中 vendor/assets/javascripts/jquery_plugins/manifest.js

//= require_directory .

并在app/assets/javascripts/application.js通过

提出要求
//= require jquery_plugins/manifest

编辑(甚至更简单的方式)

感谢@LeEnno为此

您实际上可以将所有与单个库相关的文件放在以库命名的文件夹中,例如vendor/assets/javascripts/bootstrap,并在同一文件夹中添加index.js作为您的清单,Rails会自动选择它了

如果在你的

app/assets/javascripts/application.js

添加行

//= require bootstrap

太容易了!!! 链接到Rails Asset Pipeline Guide

答案 1 :(得分:12)

我遇到了同样的问题。我仍然不确定这是一个错误或故意行为,但似乎Rails.application.config.assets.paths仅适用于单个文件,即require jquery等等。显然,资产加载路径仅用于返回单个require的最佳匹配,但不能用于require_directoryrequire_tree

就我而言,要加载vendor/assets/javascripts中的所有文件,我必须将以下内容添加到app/assets/javascripts/application.js

//= require_tree ../../../vendor/assets/javascripts/.

在你的情况下,这样的事情应该有效:

//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require_directory ../../../../../vendor/assets/javascripts/jquery_plugins
//= require_directory ../../common
//= require_directory ../common
//= require_self

您似乎总是需要使用文件中的相对路径来调用require_directoryrequire_tree

另外,我发现有关JS资产结构的讨论很有帮助:Rails 3.1 asset pipeline and manually ordered Javascript requires