在将我们的Rails3.2 Ruby 1.9应用程序升级到Rails3.2 Ruby 2.1.2应用程序时,我有一个谜要解决。Nokogiri似乎崩溃了,因为它使用open-uri改变了它的行为。没有gem版本被改变,只有ruby版本(这都是在OSX Mavericks上,使用brew, gcc4等)。
复制步骤:
$ ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-darwin13.1.0]
$ rails console
Connecting to database specified by database.yml
Loading development environment (Rails 3.2.18)
> feed = Nokogiri::XML(open(URI.encode("http://anyblog.wordpress.org/feed/")))
=> #(Document:0x3fcb82f08448 {
name = "document",
children = [
..
> feed.xpath("//item").count
=> 10
一切都好!接下来,在将rvm更改为Ruby 2.1.2并进行捆绑安装之后…
$ ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]
$ rails console
Connecting to database specified by database.yml
Loading development environment (Rails 3.2.18)
> feed = Nokogiri::XML(open(URI.encode("http://anyblog.wordpress.org/feed/")))
=>
> feed.inspect
=> "#<Nokogiri::XML::Document:0x86a1f21c name="document">"
> feed.xpath("//item").count
=> 0
所以它看起来像'打开'编码已经改变,在gzip http流没有被正确地馈送到nokogiri?我检查了nokogiri -v,它使用的是打包的xml库,而不是系统库。这是一个开放uri的Ruby 2.1.2问题吗?
另一个理论是,其中一个宝石有猴子修补开放的uri修复1.9的东西,这是打破2.1?请提供帮助或想法!
编辑:这里是不使用Nokogiri的更多信息,即认为这更多是Ruby 2.1.2上的开放uri问题:
> open(url) {|f|
* f.each_line {|line| p line}
* p f.content_type
* p f.charset
* p f.content_encoding
* }
"u001Fx8Bbu0000u0000u0000u0000u0000u0000u0003xEDx9DxDBreWxB2xA6xAFxEDxA7xA8xCDu001ExB7/$u0010..
(snip)
3xF3xA79xA7xFAɗxFFu000FxEAox9Cu0014kxE8u0000u0000"
"text/xml"
"utf-8"
["gzip"]
=> ["gzip"]
. .1.9版本是可读的,也就是说gzip已经应用了。
如果我进入一个干净的ruby irb,它工作正常,所以它一定是在我的rails宝石改变open-uri打开的行为,而不是deflate/gzip。我有很多宝石参考…(
好吧,这是答案,也许是答案。Ruby 2改变了它在HTTP请求和压缩/压缩中使用报头的方式,但在某种程度上,他们又改变了主意,把它放在1.9的工作方式上。在此期间,一些Rails gem维护者给HTTP:Net打了补丁,使他们的gem在1.9和2.0上都能工作。那些猴子补丁仍然在旧版本的宝石中徘徊,并导致我看到从1.9升级到2.1的问题
问题和解决方案的总结:
http://avi.io/blog/2013/12/17/do-not-upgrade-your-rails-project-to-ruby-2-before-you-read-this/我们使用gem right_aws,关于ruby版本的细节在这里:
https://github.com/sferik/twitter/issues/473解决方案是在Gemfile中使用这个作为gem引用来撤销monkey补丁:
gem 'right_http_connection', git: 'git://github.com/rightscale/right_http_connection.git', ref: '3359524d81'
背景阅读和更多信息:
https://github.com/rightscale/right_aws/issues/167