0

我正在尝试部署一个包含 jQuery Mobile 的 Rails 3 应用程序。它在开发中运行良好,我知道它需要预编译 JS 和 CSS 以用于生产。我收到以下错误:

Started GET "/orders/mobile" for 127.0.0.1 at Wed Jun 06 14:22:40 -0400 2012
Processing by OrdersController#mobile as HTML
  Rendered orders/mobile.html.erb within layouts/mobile (642.9ms)
Completed 500 Internal Server Error in 1122ms

ActionView::Template::Error (jquery.mobile isn't precompiled):
5: <head>
6:   <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
7:   <title>Company Orders</title>
8:   <%= stylesheet_link_tag 'jquery.mobile' %>
9:   <%= stylesheet_link_tag 'jquery.mobile.structure' %>
10:   <%= stylesheet_link_tag 'jquery.mobile.theme' %>
11:     <%= stylesheet_link_tag 'http://fonts.googleapis.com/css?family=Ubuntu' %>
app/views/layouts/mobile.html.erb:8:in `_app_views_layouts_mobile_html_erb__605278794_69818059003840'
app/controllers/orders_controller.rb:330:in `mobile'
app/controllers/orders_controller.rb:329:in `mobile'

我已经阅读了通常的东西,但是这里有很多错误,我几乎不知道从哪里开始:

  1. 我在应用程序/资产中有 JQM 的东西,但后来将它们移到了供应商/资产中。它们被预编译器看到——我知道,因为它会在各种尝试中抱怨它们——但它们似乎从未被预编译(在任何一个位置)。
  2. 我已经*= require_tree ../../../vendor/assets/stylesheets在 application.css 中尝试过。我真的不希望它包含在每个页面点击中,所以我想将它包含在布局中,但我只是想以某种方式对其进行预编译。
  3. 我已经*= require jquery.mobile[[.css].erb]在 application.css 中尝试过。
  4. config.assets.precompile += %w( [[./]vendor/assets/stylesheets/]jquery.mobile.* )在 config/environments/production.rb 中尝试过。

作为最后的努力,我从 jquery.mobile.css.erb 中删除了“.erb”,并删除了<% asset_data_uri %>标签以查看它是否可以编译。它通过了rake assets:precompile命令,但仍然给我同样的错误。

我不想关闭 JQM 的预编译;我想让它工作。(我真的需要加快这个页面的速度。)但是,我找不到任何关于如何将 JQM 优雅地插入 Rails 3 应用程序(带有预编译)的指南,而且我已经用尽了我在试用中能想到的所有途径和错误。肯定有人这样做了,并且知道正确的方法。

4

1 回答 1

0

我的基本问题是我需要为生产预编译一些资产,但不包括在每个页面点击中。这是我想出的:

如果我不介意每个页面都提供 JQM,我可以将文件放在 app/assets 中并让它require_tree .发挥作用,或者将这些文件放在 vendor/assets 中,然后require将它们单独放在 application.js 中。如果我想将它们放在供应商/资产中,而不是在 application.js 中特别需要它们,我可以config.assets.paths << "#{Rails.root}/vendor/assets"在 production.rb 中使用,并且(显然)require_tree在 application.js 中也会处理这个树。这仍然会将它们汇总到已编译的应用程序 JS“球”中,但会使它们在文件系统上不同。

为特定页面合并 jQuery Mobile并将其文件在供应商/资产中分开的正确方法似乎是同时使用config.assets.paths << "#{Rails.root}/vendor/assets"指令config.assets.precompile += %w( jquery.mobile.* )指令。这将使 JQM 文件预编译,但不会汇总到 application-(hash).js 和 application-(hash).css 中。(它们将是公共/资产中的单个文件。)然后您可以在专门针对移动视图的布局中执行特定javascript_include_tag的 ' 和stylesheet_link_tag' 。

大结局:我已经升级到 Rails 3.2.5,因为我看到了一些关于 3.2.3 的安全报告。我回滚到 3.2.3 并且 - 结合我在上面学到的东西 - 我终于能够让它工作。我也试过3.2.4。显然,> 3.2.3 中的回归会干扰预编译。

于 2012-06-07T18:04:31.843 回答