【问题标题】:How to play dojo with sprockets in rails edge?如何在导轨边缘使用链轮玩道场?
【发布时间】:2011-04-15 17:32:20
【问题描述】:

Rails 3.1 edge 使用 sprockets 来处理 .js 和 .scss 文件。 Sprocket 使用 cmets 来处理依赖关系。

我将三个文件夹 (dojo dijit dojox) 放在 vendor/assets/javascripts 中。 然后在 app/assets/javascripts/application.js 中添加一行 //= 需要道场/道场 console.log(dojo);

现在 dojo 已合并到 application.js 中。 但是dojo本身有依赖系统。当我需要更多的 dojo 模块时。它找不到正确的路径。 dojo.require("dojox.grid.DataGrid"); // webkit 控制台中的错误:错误:无法加载 'dojox.grid.DataGrid';最后尝试'../dojox/grid/DataGrid.js' // Rails 服务器日志中的错误:在 2011 年 4 月 16 日星期六 01:26:05 +0800 开始 GET "/undefined../dojox/grid/DataGrid.js" for 127.0.0.1

这是两个不同的依赖系统。我怎样才能把它们放在一起?

【问题讨论】:

    标签: ruby-on-rails-3 dojo sprockets


    【解决方案1】:

    dojo.js 不会太自然地被重命名。这是因为 Dojo 初始化过程的一部分涉及在 DOM 中搜索负责加载自身的脚本标记。这样做有两个原因:

    1. 确定其baseUrl(如果尚未指定)
    2. 获取脚本标签本身中指定的任何djConfig(或1.6+ 中的data-dojo-config)属性

    当它搜索这个脚本标签时,它会寻找一个将src 设置为dojo.jsdojo.xd.js 的标签;在您的情况下找不到它,因此失败了。

    应该可以解决这两个问题,通过在另一个 script 标签中完全以编程方式指定 djConfig(或 1.6+ 中的 dojoConfig之前加载 Dojo 的标签,并在这些配置属性中手动指定baseUrl

    例如,如果您的 application.js 在原始帖子中提到的 vendor/assets/javascripts 中,您可以尝试这样做:

    <script type="text/javascript">
        //if you're using 1.5 or earlier, use djConfig instead of dojoConfig
        var dojoConfig = {
            //note that baseUrl points to the folder containing dojo.js, therefore the dojo folder
            baseUrl: 'vendor/assets/javascripts/dojo/'
        };
    </script>
    <script type="text/javascript" src="vendor/assets/javascripts/application.js"></script>
    

    有关dojo配置设置的更多信息:http://dojotoolkit.org/reference-guide/djConfig.html(事实上,该页面实际上在 baseUrl 下有一个注释,专门关于重命名dojo.js。)

    【讨论】:

    • 这个问题更复杂,因为 gem 'sprockets' 并且启用了默认的 rails master 分支config.assets.enabled = true。 rails 3.1.0.beta 像这样处理 .js 文件:将 vendor/assets/javascripts/jquery.js 合并到 application.js 中。将app/assets/javascripts/**/*.js 合并到application.js。在布局 .erb 文件中包含 application.js。它通过 cmets 检查依赖关系。 IMO,这两个地方用于自定义脚本不存在框架。 Specifying dependencies with the require directive
    • 事实上。 rails 3.1.0.beta 以同样的方式处理样式表。甚至图像。 Sprockets 将 app/assets 下的 javascripts 样式表图像合并到一个文件中。如果这些文件“需要”另一个不在此处的文件。它将从供应商/资产中搜索。大多数框架不能遵循这个规则。 Dojo 将样式和图像放在模块子文件夹中。所以我认为,我们不能把框架放在这两个地方。我们必须将它们作为静态文件放在 public/ 下。
    • 看起来有一个 SprocketsController 或 sprockets 中间件。 Rails 3.1.0.beta 使用它来处理所有传入的资产请求。
    【解决方案2】:

    尝试将dojo 文件添加到/vendor/assets/javascripts 下的dojo/scripts 目录中。在dojo目录下,在dojo目录下创建一个dojo.js文件,并将//= provide "scripts"放入该文件中。

    然后在您的application.js 文件中放入//= require &lt;dojo&gt;。查看 Sprockets 网站 http://getsprockets.org/ 了解信息,但这应该可以。

    文档还没有针对 Rails 3.1 和资产管道,所以很多这些东西都在尝试自己弄清楚。

    【讨论】:

      【解决方案3】:

      嗯...为什么将您的 javascripts 放在 vendor 和应用程序中而不是 public/javascripts 中?你已经在public/javascripts=javascript_include_tag('path_to_javascript') 中包含任何内容,其中path_to_javascript 将是"dojo/DataGrid" for public/javascripts/dojo/DataGrid.js

      http://guides.rubyonrails.org/getting_started.html

      【讨论】:

      • 你可以新建一个rails 3.1.0.beta项目。 Sprockets 是 Gemfile 中的默认 gem,默认启用资产管道:
      • 啊,抱歉...您应该能够重命名文件,以便按字母顺序加载依赖项,不是吗?
      【解决方案4】:

      我知道可能有点晚了,但我可以帮助别人。

      I finally made it work and posted the explanations here.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-11
        • 2015-01-19
        • 2020-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-09
        • 1970-01-01
        相关资源
        最近更新 更多