2012-01-24 11 views
1

Ruby on Railsプロジェクトはしばらく手を触れていません.Rails 2.0から3.1にアップグレードしようとしています。Ruby 1.8.7でモジュールのソースの場所を見つける

モデルの1つを試してインスタンス化しようとするとエラーが発生します。モデルの1つがモジュールのどこかで定義されているように見えますが、これがインスタンス化できなくなってしまいます。

[email protected] ~/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 

(かなり小さい)アプリで、このモジュールが定義される場所を私は見つけることができません。

[email protected] ~/code/spelling $ cd app 
[email protected] ~/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> 

[email protected] ~/code/spelling/app $ find ./ -name "spelling*" 
./views/spellings 
./views/admin/spellings 
./models/spelling.rb 
./models/spelling_user.rb 

はい誰がこれを引き起こしているのか知っていますか?あるいは、私はこのモジュールがどこに定義されているかを追跡することができますか?

答えて

-1

だから。 。 。 。完全に間違った場所で多くの狩りをした後、私は(明らかな)答えを見つけた。

[email protected] /tmp/spelling $ cat config/application.rb 
require File.expand_path('../boot', __FILE__) 

require 'rails/all' 

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

レール2.xからレール3.1にアップグレードすると、アプリケーション名がモジュールになります。アプリケーションと同じ名前のモデルがあったので、このモデルは失敗しました。

(私はgrepする時にapplication.rbショーでこのラインを見て、それを割り引いていた)

アプリケーションの残りの部分がうまく働いていた、それは私がこのモデルに応じて、何かに到達したときだけであることが確認されました失敗する。アプリケーション全体を少しずつ(spelling_newと呼ばれる)一時的なアプリケーションにコピーしたとき、元のアプリケーションには何らかの欠点があって、spelling_new - >spellingという名前に変更されていたはずです。この時点で、すべてが再び爆発し、犯人は明らかになった。

2

はこれを試してみてください:

Spelling.ancestors 

あなたにそれがあるの手掛かりを与えるすべての親クラスとモジュールを与えるであろう。

y $LOAD_PATH 

が、それはあなたのパスのリストが表示されますが、あなたはあなたのコードと競合するものを見つける必要があります:問題が解決しない場合は、LOAD_PATH変数に探して。それはかなりたくさんありますが、ほとんどの宝石は名前空間がよく、おそらくそれはどこかに座っているカスタムパッチです。

+0

Spelling.ancestorsは私に1アイテムの配列[Spelling]を与えます。あまりにも有益ではありません!私はハントラウンド$ LOAD_PATHを持って、私は何を見つけることができます参照してください。 –

+0

$ LOAD_PATHには不運があります。.rvm /ディレクトリをすべて検索してしまいましたが、他の参照は見つかりませんでした。 Ruby 1.9.2にアップグレードすると、Object.source_locationはモジュールのソースを返しますか?またはクラスのソースだけに含まれていました... –

+0

__file__またはsource_location、http://stackoverflow.com/questions/175655/how-to-find-where-a-methodでこのポストの解決策を試してください-is-defined-at-runtime、それは私のためには機能しませんでしたが、私は1.8.7 –

関連する問題