重构.js文件和目录

时间:2013-10-11 17:28:38

标签: ruby-on-rails ruby-on-rails-3.2

当我最近开始使用我的应用程序的移动版本时,我意识到我没有使用为桌面客户端编写的所有javascript代码。所以我把它放在application.html.erb

<% if mobile_agent? %>
  <%= javascript_include_tag "mobile" %>
  <%= stylesheet_link_tag "mobile", :media => "all" %>
<% else %>
  <%= javascript_include_tag "desktop" %>
  <%= stylesheet_link_tag "desktop", :media => "all" %>
<% end %>

在app中&gt;资产&gt; javascripts我创建了这个结构

- desktop.js
- mobile.js
- desktop/file1.js
- desktop/file2.js
- mobile/file1.js
- mobile/file2.js
- shared/file1.js
- shared/file2.js

在mobile.js中:

//= require_tree ./mobile
//= require_tree ./shared

在desktop.js中

//= require_tree ./desktop
//= require_tree ./shared

在开发环境中运行良好,但是当我部署到Heroku时它给了我一个错误:

Completed 500 Internal Server Error in 100ms
ActionView::Template::Error (mobile.js isn't precompiled):
    8:   <meta name="format-detection" content="telephone=no">

    11:     <%= javascript_include_tag "mobile" %>
    9: 
    12:     <%= stylesheet_link_tag "mobile", :media => "all" %>
    10:   <% if mobile_agent? %>
  Parameters: {"community_category"=>"swingdancing", "city"=>"stockholm"}
  app/views/layouts/application.html.erb:11:in 78182492067426179_45617280'
    13:   <% else %>
Completed 500 Internal Server Error in 2ms
  app/controllers/communities_controller.rb:20:in `show'
Processing by ErrorsController#show as HTML
    14:    <%= javascript_include_tag "desktop" %>
  /app/vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.13/lib/sprockets/helpers/rails_helper.rb:142:in Error during failsafe response: mobile.js isn't precompiled

导致此错误的原因是什么?如何解决?

1 个答案:

答案 0 :(得分:0)

该怎么办?

只需添加

 config.assets.precompile += %w(mobile.js)

config/application.rb

为什么?

当您部署到生产环境时,默认情况下rails使用asset pipeline

这意味着,不是直接提供assets/中的文件,rails会假定您事先已经运行rake assets:precompile,并且您的资产中存在连锁,压缩和缩小版本夹。

这意味着您打算从浏览器加载的每个资产都应该进行预编译。好处是,不是提供许多人类可读的文件,而是只提供一些已经缩小的文件 - 更少的连接,更少的体积=更快的加载时间。

此功能在开发模式下处于非活动状态,因为您必须在每个请求时重新编译资产,而且能够读取js和css对于调试非常有用。