Rails Rails 3.1 Assets Pipeline 应该怎么配置?

suupic · 发布于 2011年11月27日 · 最后由 iwinux 回复于 2012年5月02日 · 11159 次阅读
145

js/css文件加载不上,求解

环境:

  • rails 3.1.3
  • unicorn 4.1.1
  • nginx 1.0.6

现象:

  1. 用rails s启动开发模式,一切正常。请求地址为http://dev:3000/assets/application.js?body=1
  2. 用rails s -e production 启动,assets pipeline异常。请求地址为http://dev:3000/javascripts/application.js404错误
  3. 用unicorn -c config/unicorn.rb 启动,异常。请求地址为http://dev/assets/application.js?body=1, 404错误
  4. 用unicorn -c config/unicorn.rb -E production启动,异常。请求地址为:http://dev/javascripts/application.js, 404错误。且仅加载application.js/css,上面3种情况则会加载很多其他的js/css

404时, nginx的日志为:

open() "xxxxx/public/assets/application.js" failed (2: No such file or directory

rails的日志为:

ActionController::RoutingError (No route matches [GET] "/javascripts/application.js"):

unicorn的日志为:

cache: [GET /javascripts/application.js] miss

production配置(局部,其他选项默认)为:

config.serve_static_assets = false
config.assets.compress = true
config.assets.compile = false
config.assets.digest = true
config.assets.debug = true
共收到 24 条回复
96

http://guides.rubyonrails.org/asset_pipeline.html 参考下这篇,部署到production前要precompile一下,还有注意下js,css helper的使用

145

昨晚已经跟着asset_pipeline.html里的指导做了 刚才又整理一下思路 1、在development下,assets pipeline会尝试加载所有controller命名的js和css。WEBrick下的请求全部返回200;unicorn下的所有controller命名的全部404,application/jquery返回200。 访问地址均assets+文件名,例如/assets/application.js?body=1 2、在production下,assets pipeline不会加载controller命名的js和css。请求地址为“文件类型”+文件名,例如/javascripts/application.js和/stylesheets/application.css。注意,不是assets目录。

所以我想,解决这个问题的关键在于为什么production下会把路径转换为“文件类型+文件名”的形式,而不是“assets+文件名”的形式。product下手动输入“assets+文件名”是可以访问的

搭车再多问一句,为什么development会加载controller的js而production不会

96

#3楼 @suupic dev环境不压缩js所以你看到都在head里。prod环境全部压缩到applications.js这个文件里了。

145

我的问题跟这个很像 http://stackoverflow.com/questions/7890845/rails-3-1-cant-enable-asset-pipeline-in-the-app

昨晚我也尝试了将config.assets.enabled设成false,后来又改回true。不确实是否跟这个有关系

145

现在的感觉就是production里没有启用assets pipeline

96

#7楼 @suupic 最好是有代码能让我们下到自己电脑上跑一跑。。

145

yeah,解决了!

原因是我用了mongoid,按照mongoid的要求,在application.rb中做了修改,注释rails/all #require 'rails/all' require "action_controller/railtie" require "action_mailer/railtie" require "active_resource/railtie" require "rails/test_unit/railtie"

这个修改导致处理assets pipeine的sprockets没有被加载 因此解决方法是在后面追加一句 require 'sprockets/railtie'

78

#9楼 @suupic great! 很巧昨天ruby-china代码里也刚加了这个。

De6df3

#10楼 @ashchan 没看太明白,加了 #9楼 这行以后,是不是就不用手动配置这个了?

config.assets.precompile += %w(home.css foo.js)
96

#12楼 里那个正则是针对 Compass 写的,在包含所有 css/js/图片 文件的前提下,排除 Compass 的 partials (文件名是下划线开头的,比如 _shared.css.sass)

78

#11楼 @huacnlee 个人觉得如果application.{js|scss}里组织好的话,是不用额外去配置的(因为production下都会被压到application中去,而这个是自动被precompile的)。

上面加入sprockets,是因为如果用mongoid改了railtie的加载的话,sprockets就漏掉了。这样在production下会出现digest不正常等问题。

De6df3

#14楼 @ashchan 我一般的设计方式是一个 application.css 和 controller_name.css ,这样 CSS 可以细化,JS 也是类似的做法

78

#15楼 @huacnlee 嗯,我也这么做。另外,第三方的js(包括jquery)和css及image,我一般放在vendor/assets下,app/assets下只放自己写的内容并且require_tree全包含进来。

比方说ruby-china已经用了jquery-rails,那样就没必要再单独存放一份jquery了。这方面什么时候可以重新组织一下。

96

#9楼 @suupic +1 一语中的

96

不喜欢 config.assets.precompile += %w( active_admin.js active_admin.css ) 这样的配置方式

De6df3

#18楼 @ruisin 是啊,这样很蛋疼,总会在发布的时候才发现少了个 CSS 或 JS ...

96

这个我收藏了。。。

96

@ruisin @huacnlee 所以可以试试我这种写法~

De6df3

#12楼 @iwinux 这个方法靠谱!

101

#12楼 @iwinux 你的方法很好,今天搜索到这个帖子,重写了一下,应该更简洁吧:

config.assets.precompile += [ Proc.new {|path| File.basename(path) =~ /^[^_].*\.\w+$/} ]

96

#23楼 @daqing 我是觉得 assets:precompile 这么慢,puts 点东西出来比较友好,哈哈~

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册