如何为Rails 3生产预编译jQuery Mobile?

时间:2012-06-06 18:40:30

标签: ruby-on-rails-3 jquery-mobile asset-pipeline

我正在尝试部署包含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'

我已经阅读了usual的内容,但这里有很多错误,我几乎不知道从哪里开始:

  1. 我在app / assets中有JQM的东西,但后来又将它们移到了供应商/资产。预编译器会看到它们 - 我知道因为它会在各种尝试中抱怨它们 - 但它们似乎从未预先编译过(在任何一个位置)。
  2. 我在application.css中尝试了*= require_tree ../../../vendor/assets/stylesheets。我真的不希望它包含在每个页面中,所以我想将它包含在布局中,但我只是想以某种方式预编译它。
  3. 我在application.css中尝试了*= require jquery.mobile[[.css].erb]
  4. 我在config / environments / production.rb中尝试了config.assets.precompile += %w( [[./]vendor/assets/stylesheets/]jquery.mobile.* )
  5. 作为最后的努力,我从jquery.mobile.css.erb中删除了“.erb”,并删除了<% asset_data_uri %>标记以查看它是否可以编译。它传递了rake assets:precompile命令,但仍然给了我同样的错误。

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

1 个答案:

答案 0 :(得分:0)

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

如果我不介意为每个页面提供JQM,我可以将文件放在app / assets中,让require_tree .发挥其魔力,或将这些文件保留在供应商/资产中,{{1它们分别在application.js中。如果我想将它们放在供应商/资产中而不是在application.js中特别要求它们,我可以在production.rb中使用require,在application.js中显然会config.assets.paths << "#{Rails.root}/vendor/assets"处理这个树同样。这仍然会将它们卷入已编译的应用程序JS“ball”中,但在文件系统上将它们区分开来。

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

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