2013-08-28 100 views
1

我想了解爲什麼我的類方法不被識別。下面是我的代碼:爲什麼我的班級方法不被識別?

wiki_patch.rb

require_dependency 'wiki_content' 

module WikiRecipientPatch 
    def self.included(base) 
     base.send(:include, InstanceMethods) 

     base.class_eval do 
     alias_method_chain :recipients, :send_wiki_mail 
     end 
    end 
end 

module InstanceMethods 
    def self.set_mail_checker(mail) 
     @mail_checker = mail 
    end 
end 

Rails.configuration.to_prepare do 
    WikiContent.send(:include, WikiRecipientPatch) 
end 

controller.rb

WikiContent.set_mail_checker(params[:mail_checker_wiki]) 

我收到此錯誤:

NoMethodError (undefined method `set_mail_checker' for #<Class:0x4876560>): 

任何想法,爲什麼會發生什麼的解決方案是?

回答

1

你的成語有點不對。

  1. ClassMethods/InstanceMethods模塊應該被嵌套在「主」模塊(WikiRecipientPatch在這種情況下)英寸
  2. 你正在包括實例方法,但期望類方法以某種方式由此產生?當然你的意思是extend ClassMethods,不是嗎?

    module WikiRecipientPatch 
        def self.included(base) 
        base.extend ClassMethods 
        end 
    
        module ClassMethods 
        def set_mail_checker(mail) 
         'mail checker' 
        end 
        end 
    end 
    
    class WikiContent; end 
    
    WikiContent.send(:include, WikiRecipientPatch) 
    
    WikiContent.set_mail_checker('whatever') # => "mail checker" 
    
+0

使用你的提示,我得到了以下錯誤:'NoMethodError(用於InstanceMethods :: WikiContent未定義的方法'set_mail_checker」:類)'。我做錯事情了? – kamusett

+0

@ user2195342,可能。因爲答案中的代碼有效。 –

+0

我忘了提及我的模塊內有兩種方法。模塊包含了其中一種方法。另一個是上面列出的。爲了簡化問題,我隱藏了另一個。 – kamusett