2009-08-31 14 views
1

私がモデルを持って、表示およびモジュールユーティリティRailsモデルから適切にモジュールと関数を呼び出すにはどうしたらいいですか?

class Show < ActiveRecord::Base 
    include Utilities 

    ... 
    def self.something 
     fix_url("www.google.com") 
    end 
end 

マイユーティリティファイルはlibに/ utilities.rb

module Utilities 
    def fix_url(u) 
    !!(u !~ /\A(?:http:\/\/|https:\/\/)/i) ? "http://#{u}" : u 
    end 
end 

である。しかし、私はそれを呼び出すときRailsは「fix_url」のNoMethodErrorを投げています私のショークラスで。私のモデルにモジュールを含めるときに何か別のことをしなければならないのですか?

ありがとうございます!

答えて

4

includeの代わりにextendを介してそのミックスインを注入してみてください。基本的には、mixinメソッドをクラスメソッドから呼び出すので、mixinを含めるとインスタンスメソッドしか利用できないためです。拡張スタイルを使用してクラスメソッドを取得できます。

Ruby for aroundを検索し、その違いを知るために拡張してください。一般的なパターンは、ここのようにそれを行うことです:あなたはincludedフックを使用

http://www.dcmanges.com/blog/27

は、両方のインスタンスとクラスレベルのメソッドをミックスインします。

@Tony - これはどの時点で私

class User < ActiveRecord::Base 
    extend Utilities 
    def self.test 
    go() 
    end 
end 

module Utilities 
def go 
    puts "hello" 
end 
end 

From console: 

>> User.test 
hello 
=> nil 

のために働く私は明示的に私がやったself.

+0

私は本当に私がShow.fix_urlをやりたいとは思っていません。私はユーティリティをシングルトンオブジェクトや、私が呼び出せる関数のセットにしたいと思っています。内の関数は、私のクラスで混在させるべきではありません。 – Tony

+0

私の更新を見てください..私はなぜあなたが望むものを正確に与えていないのか理解できません。 –

1

それは私のために働いた。サーバー/コンソールセッションを再開しようとしましたか?

編集:Utilities.fix_urlに電話をかけたい場合は、その必要がありません。

+0

を持つメソッドを呼び出す必要がありません...多分それは、関数を呼び出し、私とは何かを持っていますクラスメソッドから...より正確になるように質問を更新する – Tony

+0

私はあなたが今何をしようとしているのか知っていると思います。私は自分の答えを更新しました。 –

関連する問題