2009-08-31 37 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的被扔NoMethodError爲「fix_url」當我把它在我的表演課上。在模型中包含模塊時,我是否必須做一些不同的事情?

謝謝!

回答

4

嘗試通過extend而不是include注入mixin。基本上,因爲你從一個類方法調用mixin方法,但包含一個mixin只會使它的實例方法可用。您可以使用擴展樣式來獲取類方法。

搜索Ruby包含和擴展以瞭解差異。一個常見的模式是做它喜歡這裏:

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

如果您使用included鉤的mixin實例和一流水平的方法。

@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這是什麼擴展會完成。我希望Utilities是一個單獨的對象或者我可以調用的一組函數。裏面的功能不應該混在我的課 – Tony 2009-08-31 03:45:54

+0

看到我的更新..我不明白爲什麼'延長'不是正確地給你你想要什麼。 – 2009-08-31 03:58:48

1

它爲我工作。你有沒有嘗試重新啓動你的服務器/控制檯會話?

編輯:如果您只想致電Utilities.fix_url您可以這樣做 - 無需包含/擴展。

+0

我做的方法...也許它是與我調用該函數從一個類的方法...更新的問題更加準確 – Tony 2009-08-31 03:09:11

+0

我想我知道你現在想做什麼。我更新了我的答案。 – 2009-08-31 04:06:15

相關問題