在Ruby 1.8.7中查找Module的源位置

时间:2012-01-24 20:31:59

标签: ruby-on-rails ruby

我有一个Ruby on Rails项目已经有一段时间未被触及了,我正在尝试将它从Rails 2.0升级到3.1。

当我尝试实例化其中一个模型时,我遇到了错误。似乎其中一个模型也被定义为某个模块,这阻止了我实例化它。

dgs@dgs-desktop ~/code/spelling $ rails c
Loading development environment (Rails 3.1.1)
ree-1.8.7-head :001 > Spelling.first
NoMethodError: undefined method `first' for Spelling:Module
    from (irb):1
ree-1.8.7-head :002 > exit

拼写类非常基础:

class Spelling < ActiveRecord::Base
  belongs_to :word, :class_name => 'Word', :foreign_key => 'word_id'
end

我找不到应用程序中的位置(这是非常小的)将定义此模块:

dgs@dgs-desktop ~/code/spelling $ cd app
dgs@dgs-desktop ~/code/spelling/app $ grep Spelling * -R
models/spelling.rb:class Spelling < ActiveRecord::Base
models/word.rb:   has_many :spellings, :class_name => 'Spelling', :foreign_key => 'word_id'
models/spelling_user.rb:class SpellingUser < ActiveRecord::Base
views/layouts/application.html.erb:  <title> School Spelling Tests</title>

dgs@dgs-desktop ~/code/spelling/app $ find ./ -name "spelling*"
./views/spellings
./views/admin/spellings
./models/spelling.rb
./models/spelling_user.rb

有谁知道造成这种情况的原因是什么?或者我如何追踪这个模块的定位?

2 个答案:

答案 0 :(得分:2)

试试这个:

Spelling.ancestors

它将为您提供所有父类和模块,它们将为您提供线索。如果这不起作用,请查看load_path变量:

y $LOAD_PATH

它将为您提供路径列表,但您必须找到与您的代码冲突的路径。这是相当多的,但它应该不难,因为大多数宝石都是很好的命名空间,所以很可能,它是一个坐在某处的自定义补丁。

答案 1 :(得分:-1)

所以。 。 。 。在完全错误的地方狩猎之后,我找到了(明显的)答案。

dgs@dgs-desktop /tmp/spelling $ cat config/application.rb 
require File.expand_path('../boot', __FILE__)

require 'rails/all'

module Spelling
  class Application < Rails::Application
  ...
  end 
end

从rails 2.x升级到rails 3.1的某个地方,应用程序名称变为模块。因为我有一个与应用程序同名的模型,所以这个模型失败了。

(我在应用程序中看到过这行.rb在我的greps中显示,但是打折了)

应用程序的其余部分工作正常,只有当我根据此模型达到某些功能时才会失败。当我将整个应用程序一点一点地复制到一个临时应用程序(称为spelling_new)时,一切正常,因此决定它必须在原始应用程序中有些残缺并重命名为spelling_new - &gt; spelling。在这一点上,一切都爆炸了,罪魁祸首变得清晰。