Ruby on rails 在Rails中使用gems时,';无法删除Object::ClassMethods';源于

Ruby on rails 在Rails中使用gems时,';无法删除Object::ClassMethods';源于,ruby-on-rails,logging,rubygems,rake,Ruby On Rails,Logging,Rubygems,Rake,在安装gems时,我经常遇到以下问题: 有人知道这是什么原因吗?我已经看过好几种不同的病例,但还没有弄清楚到底是什么原因造成的 $ sudo rake gems:install --trace (in /u/app/releases/20100213003957) ** Invoke gems:install (first_time) ** Invoke gems:base (first_time) ** Execute gems:base ** Invoke environment (firs

在安装gems时,我经常遇到以下问题:

有人知道这是什么原因吗?我已经看过好几种不同的病例,但还没有弄清楚到底是什么原因造成的

$ sudo rake gems:install --trace
(in /u/app/releases/20100213003957)
** Invoke gems:install (first_time)
** Invoke gems:base (first_time)
** Execute gems:base
** Invoke environment (first_time)
** Execute environment
rake aborted!
cannot remove Object::ClassMethods
/u/app/releases/20100213003957/vendor/rails/activesupport/lib/active_support/dependencies.rb:603:in `remove_const'
/u/app/releases/20100213003957/vendor/rails/activesupport/lib/active_support/dependencies.rb:603:in `remove_constant'
/u/app/releases/20100213003957/vendor/rails/activesupport/lib/active_support/dependencies.rb:603:in `instance_eval'
/u/app/releases/20100213003957/vendor/rails/activesupport/lib/active_support/dependencies.rb:603:in `remove_constant'
/u/app/releases/20100213003957/vendor/rails/activesupport/lib/active_support/dependencies.rb:549:in `new_constants_in'
/u/app/releases/20100213003957/vendor/rails/activesupport/lib/active_support/dependencies.rb:549:in `each'
/u/app/releases/20100213003957/vendor/rails/activesupport/lib/active_support/dependencies.rb:549:in `new_constants_in'
/u/app/releases/20100213003957/vendor/rails/activesupport/lib/active_support/dependencies.rb:156:in `require'
/u/app/releases/20100213003957/vendor/rails/railties/lib/tasks/misc.rake:4
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:617:in `call'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:617:in `execute'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:612:in `each'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:612:in `execute'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:578:in `invoke_with_call_chain'
/usr/lib64/ruby/1.8/monitor.rb:242:in `synchronize'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:571:in `invoke_with_call_chain'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:564:in `invoke'
/u/app/releases/20100213003957/vendor/rails/railties/lib/tasks/gems.rake:17
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:617:in `call'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:617:in `execute'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:612:in `each'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:612:in `execute'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:578:in `invoke_with_call_chain'
/usr/lib64/ruby/1.8/monitor.rb:242:in `synchronize'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:571:in `invoke_with_call_chain'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:588:in `invoke_prerequisites'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:585:in `each'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:585:in `invoke_prerequisites'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:577:in `invoke_with_call_chain'
/usr/lib64/ruby/1.8/monitor.rb:242:in `synchronize'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:571:in `invoke_with_call_chain'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:564:in `invoke'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2027:in `invoke_task'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2005:in `top_level'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2005:in `each'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2005:in `top_level'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2044:in `standard_exception_handling'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:1999:in `top_level'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:1977:in `run'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2044:in `standard_exception_handling'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:1974:in `run'
/usr/lib64/ruby/gems/1.8/gems/rake-0.8.4/bin/rake:31
/usr/bin/rake:19:in `load'
/usr/bin/rake:19

我今天也开始发现这个奇怪的错误——追溯到一个过时的mysql gem

我刚从使用MacMySQL包(带有PrefPane的包)切换到自制编译版本,旧的/usr/local/MySQL在我的路径上徘徊


删除那个目录(以及旧MySQL的其他痕迹),然后重新绑定我的应用程序,解决了这个问题

我又遇到了这个问题。经过一些调试,我得出了这样的结论:这个奇怪的错误意味着Rails在需要某些特定库时遇到了一些问题。问题是Rails没有告诉我们是哪个库导致了问题。所以,你要做的第一步是:

打开此文件(或安装中的相应文件): /u/app/releases/2010021303957/vendor/rails/activesupport/lib/active\u support/dependencies.rb

然后编辑
load\u with\u new\u constant\u marking
方法,使其如下所示:

def load_with_new_constant_marking(file, *extras) #:nodoc:
  if Dependencies.load?
    Dependencies.new_constants_in(Object) { load_without_new_constant_marking(file, *extras) }
  else
    load_without_new_constant_marking(file, *extras)
  end
rescue Exception => exception  # errors from loading file
    puts "FAILS HERE: " + file
    exception.blame_file! file
    raise
end
从现在开始,在运行应用程序或rake任务时,Rails将告诉您是哪个文件导致了问题,而不是仅仅告诉您“无法删除Object::ClassMethods”(无法删除Object::ClassMethods)(只需查找“FAILS HERE”语句)。(顺便说一句,我想这就是
exception.bull_file!
方法应该做的,但它显然不是那样工作的。)

找到导致问题的文件后,可以深入研究该特定块并使用一些异常块来找到问题的核心


希望这有帮助。

此错误的原因是双重异常。通常,代码中的某些内容正在崩溃,这会引发初始异常。然后Rails的custom require尝试通过删除部分定义的常量来保持名称空间的整洁,这是方法中的
new\u constants\u的目的。问题在于
中的
新的\u常量\u没有正确地处理代码中的某些特定构造,我怀疑这是由于错误处理模块名称空间或其他原因造成的(因为类方法可能位于除对象之外的某个模块内)。在任何情况下,我都没有将错误追溯到Rails组件或其他任何东西,因为坦率地说,这是不值得的

解决方案(除了对Rails核心提出一些入侵性较小的建议)是一个快速的破解,以找出是什么引发了最初的异常。您所需要做的就是转到
依赖项所在的位置。
中的新的\u常量\u被调用并注释掉(有几个地方可以这样做)。例如:

def require(file, *extras) #:nodoc:
  if Dependencies.load?
    Dependencies.new_constants_in(Object) { super }
  else
    super
  end
rescue Exception => exception  # errors from required file
  exception.blame_file! file
  raise
end
注释掉
内容中的
新常量\u:

def require(file, *extras) #:nodoc:
#  if Dependencies.load?
#    Dependencies.new_constants_in(Object) { super }
#  else
    super
#  end
#rescue Exception => exception  # errors from required file
#  exception.blame_file! file
#  raise
end

然后您将立即看到您的错误。

我遇到了这个问题,并尝试了上述每个解决方案,但都没有成功


在我的例子中,问题是我意外地将
ActionView::Helpers::TextHelper
ActionView::Helpers::NumberHelper
包含在文件的顶部(从而将它们包含在根对象类中),这在Rails 3.0.0.rc中工作正常,但在Rails 3.0.1中引发了“无法删除对象::类方法”,一旦启动,应用程序就会一直卡住,直到服务器重新启动。

这种情况开始发生在我身上,但只是在我将延迟的作业gem包含在包中之后。像上面的Eric一样,我在控制器的顶部包括了ActionView::Helpers::TextHelper和ActionView::Helpers::NumberHelper,但有趣的是,在我开始使用延迟作业之前,我没有任何问题。我不知道发生了什么,我只是删除了include,问题似乎消失了。

我相信我已经找到了一种实用的非侵入式方法来找到问题的根源。它适合我(Rails 2.3):

碰巧发生了异常,怪文件!在某个时刻调用,尽管它将失败并导致新错误,从而掩盖原始错误

那么,打开你的第一个初始值设定项并添加

class Exception
  def blame_file!( file )
    puts "CULPRIT >> '#{file.to_s}' # #{self.to_s}"
  end
end
您将得到被指控的文件和原始错误消息。这应该足以指出你的问题


别忘了删除异常初始值设定项片段。

你到底想出了什么解决方案吗?没有:(仍在等待帮助。请参阅下面我的最终答案投票支持你,因为你的解决方案不涉及破解库代码,即使是暂时的。非常棒!你刚刚为我节省了大量时间。