Ruby on rails 在Rails中使用gems时,';无法删除Object::ClassMethods';源于
在安装gems时,我经常遇到以下问题: 有人知道这是什么原因吗?我已经看过好几种不同的病例,但还没有弄清楚到底是什么原因造成的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
$ 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
您将得到被指控的文件和原始错误消息。这应该足以指出你的问题
别忘了删除异常初始值设定项片段。你到底想出了什么解决方案吗?没有:(仍在等待帮助。请参阅下面我的最终答案投票支持你,因为你的解决方案不涉及破解库代码,即使是暂时的。非常棒!你刚刚为我节省了大量时间。