2009-09-27 15 views
8

私は、移行の内側にメソッドを定義しようとしているが、私は未定義のメソッドのエラーを取得しています:の定義方法

undefined method 'do_something_specific' for #<ActiveRecord::ConnectionAdapters::SQLite3Adapter:0x4868018> 

それはdoesnのため、私はむしろ、他の場所でそれを定義しないと思います実際には、この特定の移行だけで、アプリケーションの残りの部分に関係しています。

class DoSomethingSpectacular < ActiveRecord::Migration 

    def self.up 
    do_something_specific(1, 2) 
    end 

    def self.down 
    end 

private 

    def do_something_specific(p_1, p_2) 
    # something happens here... 
    end 

end 

私はここで何かが欠け午前:

明確にするために、私の移行は次のように見えますか?なぜこれをこのように定義できないのですか?

答えて

8

エラーメッセージからわかるように、コードは移行クラス内からではなく接続アダプタ内から呼び出されます。私はわからないんだけど、この小さな変化が動作するはずです:私はあなたの方法は、静的行い、静的な方法でそれを呼ば

class DoSomethingSpectacular < ActiveRecord::Migration 

    def self.up 
    DoSomethingSpectacular.do_something_specific(1, 2) 
    end 

    def self.down 
    end 

private 

    def self.do_something_specific(p_1, p_2) 
    # something happens here... 
    end 

end 

注意。これは、クラススコープの問題を克服するはずです。

+0

ええ、私はそれがアダプタ内から何を呼んでいるのか理解できませんでしたが、それはまだそのスコープ内にあるはずだと思いました。とにかく、クラスのための未定義のメソッド 'do_something_specific'がエラーになりました:クラス –

+0

D'oh申し訳ありません。 'self.up'は静的メソッド自体であるため、' class'の呼び出しは 'DoSomethingSpectacular'ではなく' Class'を返します。私はサンプルコードを更新しました。 – Koraktor

+2

「DoSomethingSpectacular」を安全に削除できると思います。セルフアップで – khelll

関連する問題