新手问题 搞不定了,问个 asset 的问题

loveltyoic · 2013年08月20日 · 最后由 imlcl 回复于 2013年08月24日 · 3725 次阅读

描述一下,我在layout/application.html.erb里用下面的代码引入 js 和 css

<%= stylesheet_link_tag "application", :media => "all" %>
<%= javascript_include_tag "application" %>

之前都是在 development 环境下,没有问题。今天换做 production 环境,首先rake assets:precompile了,在public/assets目录下生成了 js 和 css。 当我启动rails s -e=production后,发现 css 和 js 都没加载,一看源码,发现变成下面这样了

<link href="/stylesheets/application.css" media="all" rel="stylesheet" type="text/css" />
<script src="/javascripts/application.js" type="text/javascript"></script>

就是说通过stylesheet_link_tag生成的路径与编译出来的路径不符!可是我在开发环境下一直没问题,看源码也是像下面这样的:

<link href="/assets/application.css?body=1" media="all" rel="stylesheet" type="text/css" />

是什么原因导致开发环境和生产环境下,这个 stylesheet_link_tag 生成的路径不一样呢? 即开发环境是预期的/asset,而生产环境却变成了不正常的/javascripts

运行 precompile 的时候指定 production 环境了没?

1 在 application.rb 是不是配置了 config.assets.prefix?默认这个值是

config.assets.prefix = "/assets"

2 它和 ENV['RAILS_RELATIVE_URL_ROOT'] 这个环境变量有关,你有没有设置过呢?

<%= javascript_include_tag "application" %> 放到</body>之前试试

楼上说的我都配置好了,precompile 的没有问题,就是通过这个<%= javascript_include_tag "application" %>生成的路径有问题,而且在开发环境就是没问题,实在想不通啊!

在 gemfile 中加入 gem 'rails_12factor'

生产环境应该用 nginx 来处理 asset,所以 Rails server 就不管它了。 如果你要用 rails server 来处理 asset,就修改 config/environments/production.rb

config.serve_static_assets = true

#6 楼 @kgen 楼主说的明明是 javascript_include_tag 生成路径不对,prefix 不对,而且也没生成 finger print,这应该跟什么来 serve assets 没有关系吧……

@loveltyoic and All:

类似问题的一个建议:

  1. 在 GitHub 创建一个 repo;
  2. 把你的程序推送上去;
  3. 描叙问题;
  4. 寻求帮助;

很多问题都是针对特定 context 的,要看源码。

#7 楼 @aptx4869 生产环境和开发环境路径是不一样的,一个给 rails serve,一个给 web server serve,你试试就知道啦

感谢大家的答复! 因为我在开发环境下一切正常,就是生产环境出问题。而且我之前也部署过,是没有问题的。 大家提到的方法我也有试验,就是对比生产环境和开发环境的差别之类的,首先是检查 envrionment 里的配置,没用。 最后竟然通过修改 Gemfile 解决了。 因为 rails 自动生成的 Gemfile 里有如下一段

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'

  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
  # gem 'therubyracer', :platforms => :ruby

  gem 'uglifier', '>= 1.0.3'
end

我把这个group :assets组去掉了。按我的理解,本来就只对 assets 这个组安装这 3 个 gem,现在我把它去掉了,就是说在所有环境下都安装这 3 个 gem,问题就解决了.... 这是为什么呢?

Rails 4 没有 group :assets 这东西……事实上我对这个也不理解……

#11 楼 @imlcl 话说这是怎么脑补出 rails 4 的……LZ 从来没提起过这个啊……

gem 'sass-rails',   '~> 3.2.3'
gem 'coffee-rails', '~> 3.2.1'

从这两行看,明明是 rails 3.2……rails 4 要用 gem 'coffee-rails', '~> 4.0.0' 另外我这从 3.2 升级到 rails4,这 3 个 gem 还是写在 asset group 里面没动过也没出过类似的问题……

#9 楼 @kgen 人家说的就是生产环境生成了错误的路径……开发环境生成的路径怎么可能像那样只有一个文件的路径,明明会是一大堆分开的文件……

是不是这 3 个 gem 只是用来生成 js 和 css 的,所以只是在 precompile 时用到。但是我如果不在 production 里用的话,include 时生成的路径就不对。这些 gem 里好像有 Helper 跟这个有关?

#14 楼 @loveltyoic 从逻辑上看,不太可能啊,如果有这种问题 rails 怎么可能自动生成的那样的 Gemfile……你这问题出现和解决得都怪怪的……可能的话,应该用 git bisect 找找看问题到底出在哪……

#12 楼 @aptx4869 我是发省思维突然想到,误会了,不好意思……

有没有

RAILS_ENV=production rake assets:precompile
需要 登录 后方可回复, 如果你还没有账号请 注册新账号