2014-02-07 31 views
1

我在这里有一个非常奇怪的问题。我在我的rails应用程序中使用了rack-zippy gem,如果我在development环境中启动它,而没有预编译的资源,它就像一个魅力。与-d参数和无。rack-zippy和选项-d在生产环境中不提供静态资产

在生产模式下(同一台机器,同一个项目,同一目录,相同的宝石)它也可以工作。但是,如果我使用-d param(bundle exec rails server -d)启动它来守护服务器,则不会提供预编译的资产。可以用thinwebrick而不是用unicorn重现。

日志说:

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

但:

$ l public/assets/application-b9b75968aed42128cfd75fb78df1e4d1.js 
-rw-r--r-- 1 public/assets/application-b9b75968aed42128cfd75fb78df1e4d1.js 

从配置/环境/ production.rb:

config.serve_static_assets = true 

从配置/ application.rb中:

config.middleware.swap(ActionDispatch::Static, Rack::Zippy::AssetServer) 

和:

$ rake middleware    
use Rack::Sendfile 
use Rack::Zippy::AssetServer 
(...) 

我现在有些困惑。有任何想法吗?

回答

1

哎哟,我从来没有遇到过这个,但我会告诉你我的直觉,也许你可以在这个地方找到位置。 (感谢您在Github问题跟踪器上报告它)。

所以独角兽是好的,但瘦,webrick不是,mmmm。

我的猜测是守护进程使用的瘦和webrick工作目录不是Rails.root。你可能会想尝试调试在机架比比此行看到的是正在搜索的资源文件什么的路径:https://github.com/eliotsykes/rack-zippy/blob/master/lib/rack-zippy.rb#L87

机架比比,因为1.1.0版本(你很可能使用,如果你正在使用最新的Gem)将所有无法找到文件的请求传递给其余的中间件堆栈。

在开发+守护进程模式下,rack-zippy会将请求传递到资产管道,所以我认为我们可以假设资产管道在守护进程模式下没有问题。

在生产+守护进程模式下,资产管道可能会被禁用(如您所愿),如果rack-zippy无法找到资产文件,它将会向前传递请求(这可能是if工作目录不是Rails.root),然后剩下的中间件会给你看到的路由错误。

如果您在生产环境中启用资产管道(非常不推荐),那么我认为路由错误会消失,而rack-zippy不会做任何有用的事情。

对不起,我没有什么更坚实的你继续。

+0

谢谢艾略特的建议。很高兴听到宝石开发者自己的声明。我会尽量按照你的想法和调试它那些天,并给你反馈:) – phortx

+1

谢谢,我期待着找出你如何得到,祝你好运! –

+0

好吧,我试过调试过。我发现的第一件事:'serve?'方法中的方法是一样的。这不是问题。但是如果服务器以守护进程模式运行,该方法返回false。如果放弃一个简单的'Dir.pwd'登录到'serve?'方法,它揭示了所有邪恶的原因(并且赞同你的直觉):没有'-d'的'Dir.pwd'是rails根目录。带'-d'的Dir.pwd只是'/'。 – phortx

1

直到固定在机架活泼的下一个版本的发布,要解决这个问题,那就是你有这行(大概在config/application.rbconfig/initializers/rack_zippy.rb):

Rails.application.config.middleware.swap(ActionDispatch::Static, Rack::Zippy::AssetServer) 

将其替换

# Rails.public_path as last argument here gets passed into the Rack::Zippy::AssetServer 
# constructor to override the default asset_root argument value. 
Rails.application.config.middleware.swap(ActionDispatch::Static, Rack::Zippy::AssetServer, Rails.public_path)