Rails 3.2 Asset Pipeline添加?body = 1但是提供空资源

时间:2012-04-24 15:30:30

标签: ruby-on-rails heroku twitter-bootstrap asset-pipeline

我在Heroku上有一个应用程序,它在我的开发环境中正常工作。但是,在Heroku上,我的一个javascripts文件是空的。它是bootstrap文件,由bootstrap_for_rails gem提供

/assets/twitter/bootstrap-a43574b1a9d30434438a56d88ff10a70.js?body=1
 ==> Returns empty file???

/assets/twitter/bootstrap-a43574b1a9d30434438a56d88ff10a70.js
 ==> Returns the js file correctly

我正在使用Rails 3.2和资产管道,并使用Heroku上的Cedar Stack。

这是我的production.rb资产设置

Production.rb

config.serve_static_assets = true

config.assets.debug = true

config.assets.compress = false

config.assets.compile = true

config.assets.digest = true

# Specifies the header that your server uses for sending files
# config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx

非常简单的application.js文件:

的application.js

 //= require twitter/bootstrap

的Gemfile

 group :assets do
   gem 'sass-rails',   '~> 3.2.3'
   gem 'coffee-rails', '~> 3.2.1'
   gem 'uglifier', '>= 1.0.3'
   gem 'twitter-bootstrap-rails', :git => 'https://github.com/seyhunak/twitter-bootstrap-rails.git'
 end

我无法弄清楚可能有问题的部分。 Heroku的?铁路?链轮? CONFIGS?

我已经尝试更改了很多production.rb设置,包括注释掉action_dispatch.x_sendfile_header。

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

我相信这是设计的。在查看实际的bootstrap文件(我在这里看:https://github.com/seyhunak/twitter-bootstrap-rails/blob/master/vendor/assets/javascripts/twitter/bootstrap.js)时,其中没有实际的js。它只是通过“// = require”行向sprockets发出信号,它应该引入和编译的.js文件。在开发模式中,链接的这些注释隐藏在前端,因为它们实际上只是sprockets / rails的实现细节。

总而言之,当您尝试查看(app / lib / vendor)/ assets / javascript文件时,除了多个“// = require”之外,该文件在前端看起来都是空的因为rails / sprockets在前端隐藏了您的实现细节。

答案 1 :(得分:0)

为什么要直接访问单个文件?在生产中,管道的想法是将application.js清单文件中引用的所有单个文件合并到一个application.js文件中。

您的代码只应通过javascript_include_tag引用application.css文件。在开发过程中,这将显示包含的所有文件,如果您将页面源视为单独的js文件,而在生产中您应该看到的是单个js文件,如

/assets/application-46187b46e120ec79eabd082567660eb1.js

答案 2 :(得分:-1)

我在Heroku上的资产组遇到了一些问题。尝试将它移到它之外,看看它是否有效。