升级到Rails 4得到了IOError(没有打开阅读)

时间:2013-11-06 09:57:54

标签: ruby-on-rails-4

我尝试将应用程序从3.2升级到rails 4.我认为所有的宝石冲突此刻已经解决,但后来我知道它可能会再次发生。

虽然我尝试“捆绑exec rails s”并在浏览器中打开应用程序转到app home index,但它给了我这个错误:

IOError(未打开阅读)

有人可以帮忙吗?非常感谢你。

这是我使用的宝石列表:

gem 'rails', '4.0.1'

gem 'sass-rails',   '~> 4.0.0'
gem 'coffee-rails', '~> 4.0.0'
gem 'uglifier', '>= 1.3.0'

gem 'jquery-rails'

gem 'jbuilder', '~> 1.2'
# add these gems to help with the transition:
gem 'protected_attributes'
gem 'rails-observers'
gem 'actionpack-page_caching'
gem 'actionpack-action_caching'
gem "activerecord-session_store"

以下是控制台的日志消息:

Started GET "/" for 127.0.0.1 at 2013-11-06 20:16:27 +1100
Processing by HomeController#index as HTML
  PCategory Load (0.5ms)  SELECT "p_categories".* FROM "p_categories"
  Rendered home/index.html.erb within layouts/application (4.1ms)
Completed 500 Internal Server Error in 15ms

IOError (not opened for reading):
  activesupport (4.0.1) lib/active_support/json/encoding.rb:256:in `each'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:256:in `to_a'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:256:in `as_json'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:58:in `block in as_json'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:81:in 'check_for_circular_references'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:57:in `as_json'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:296:in `block in as_json'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:296:in `each'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:296:in `map'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:296:in `as_json'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:58:in `block in as_json'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:81:in g`check_for_circular_references'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:57:in `as_json'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:296:in `block in as_json'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:296:in `each'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:296:in `map'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:296:in `as_json'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:50:in `block in encode'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:81:in `check_for_circular_references'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:49:in `encode'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:306:in `block in encode_json'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:306:in `each'
  activesupport (4.0.1) lib/active_support/json/encoding.rb:306:in `map'

3 个答案:

答案 0 :(得分:4)

原来,创业板冲突是我遇到的类似问题的罪魁祸首。我用来自使用Rails的间接相关问题的代码修复了问题。请看下面,我希望这可以帮到你。

#fix for JSON gem/activesupport bug. More info: http://stackoverflow.com/questions/683989/how-do-you-deal-with-the-conflict-between-activesupportjson-and-the-json-gem
if defined?(ActiveSupport::JSON)
  [Object, Array, FalseClass, Float, Hash, Integer, NilClass, String, TrueClass].each do |klass|
    klass.class_eval do
      def to_json(*args)
        super(args)
      end
      def as_json(*args)
        super(args)
      end
    end
  end
end

答案 1 :(得分:1)

我最近自己经历过这个问题。经过几天的反复试验,我最终评论了一组开发组宝石(幸运的猜测),然后逐个重新启用每个宝石,用每个新启用的宝石重建我的宝石套装。罪魁祸首原来是MetaRequest宝石及其依赖,rack-contrib(它做了一些JSONP工作)。

所以这就是我的建议:

  
      
  1. 清空宝石套装(rvm gemset empty如果你正在使用rvm)
  2.   
  3. 将您的Gemfile.lock文件重命名为Gemfile.lock.OLD(这可能没有必要,但以其他方式列出)
  4.   
  5. 在您的Gemfile中,注释掉您怀疑处理请求或执行任何JSON工作的任何宝石
  6.   
  7. 运行bundle install以重建您的宝石集,而不使用已注释掉的宝石
  8.   
  9. 重新启动服务器。如果仍然收到IOError,请重复步骤1-5。否则,请继续执行步骤6.
  10.   
  11. 取消评论您注释掉的其中一颗宝石
  12.   
  13. 运行bundle install以安装gem及其依赖项
  14.   
  15. 重新启动服务器。如果您没有遇到IOError,请重复步骤6-8。否则,您最后重新启用的gem就是原因。
  16.   

答案 2 :(得分:1)

我使用ActiveModel Serializers gem体验过这一点。我将ActiveModel Serializers从0.8.1升级到0.9,之后它运行良好。