2014-04-20 98 views
0

我有一個lib文件lister_extension.rb模塊班lib文件夾

module ListerExtension 
def lister 
    puts "#{self.class}" 
end 
end 

而且Post模型

class Post < ActiveRecord::Base 
    has_many :reviews 
    extend ListerExtension 
    def self.puts_hello 
     puts "hello123123" 
    end 
end 

一切都很好,當我把這個在rails c

2.1.1 :003 > Post.lister 
Class 
=> nil 

但是當我想添加一個類到我的模塊會發生什麼?

例如:

module ListerExtension 
class ready 
    def lister 
    puts "#{self.class}" 
    end 
end 
end 

我得到這個錯誤

TypeError: wrong argument type Class (expected Module) 

當我打電話Post.first在軌Ç

+0

爲什麼你把類名稱爲'ready'而不是'Ready'? –

回答

0

TL; DR,在Ruby中,你不容有類擴展,你擴展/包含模塊

關於

更新:例如關注 包括具有的ActiveSupport關注/延長

module Ready 
    extend ActiveSupport::Concern 

    # this is an instance method 
    def lister 
    .... 
    end 

    #this are class methods 
    module ClassMethods 
    def method_one(params) 
     .... 
    end 

    def method_two 
     .... 
    end 
    end 
end 

然後在ActiveRecord的模型,如郵政

class Post < AR 
    include Ready 
end 

這個過程中,您將獲得實例方法和類方法免費的,你也可以設置一些宏,如使用內含塊時,

module Ready 

    extend ActiveSupport::Concern 

    included do 
    has_many :likes 
    end 
end 

希望幫助,

問候

+0

所以你包括? –

+0

是的,在rails中使用ActiveSupport :: Concern包含擴展類是一個不錯的主意,但是你可以在沒有它的情況下使用ActiveSupport :: Concern來實現,只能通過帶有類方法的模塊和實例方法來實現,然後包含實例方法,類方法 – Michelson

+0

你有一個例子嗎?謝謝! –

0

從文檔的extend

添加到obj從給定的 參數每個模塊的實例方法。

因此,您無法通過擴展類訪問此類。看看包含模塊,而不是擴展它們(閱讀ActionSupport::Concern模塊以及)方法(參考here

+0

我認爲擴展使所有的功能類的功能,包括使他們的實例功能 –

+0

@MohamedElMahallawy不完全,擴展使一個模塊的所有方法可用作爲其他類/模塊的單例方法。 –