【问题标题】:Rails 3.1: javascripts not served correctly from vendor/assets directory?Rails 3.1:没有从供应商/资产目录正确提供 javascripts?
【发布时间】:2011-11-25 01:26:16
【问题描述】:

我在几个目录中组织了我的 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 时,一切正常。

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

【问题讨论】:

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


    【解决方案1】:

    您可以将清单文件添加到您尝试使用的目录中,例如 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

    【讨论】:

    • 我仍在这样做,所以如果有反对票的原因,我希望得到一些反馈。
    • 比投票的那个更干净...人们有什么问题
    • 这看起来确实更干净,我喜欢它。不过,我对此犹豫不决,因为我喜欢在 vendor/ 中有 only 供应商代码,因此如果我要更改或更新其中的内容,我不必担心覆盖我写的代码。我怀疑类似的想法是(前?)反对票的来源。
    • @jpadvo - 这确实将所有内容保存在vendor/assets 文件夹中。也许我不明白你的问题。 - 我认为这被否决了三遍,没有删除评论,因为那样@Plattsy 的评论就没有任何意义了:D
    • 如果您将 manifest.js 重命名为 index.js 您可以在 app/assets/javascripts/ 中简单地执行 //= require jquery_plugins应用程序.js。这就是Rails Asset Pipeline Guide 的建议。
    【解决方案2】:

    我遇到了同样的问题。我仍然不确定这是错误还是故意行为,但似乎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

    【讨论】:

    • 是的,*= require_tree ../../../vendor/assets/stylesheets/. 的样式表也是如此。
    猜你喜欢
    • 2011-09-27
    • 2012-02-04
    • 2013-12-10
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2013-10-12
    相关资源
    最近更新 更多