【问题标题】:Why isn't my class method recognized?为什么我的类方法无法识别?
【发布时间】:2013-08-28 13:56:15
【问题描述】:

我试图了解为什么我的类方法无法识别。以下是我的代码:

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>):

知道为什么会发生这种情况以及解决方案是什么吗?

【问题讨论】:

    标签: ruby class methods


    【解决方案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"
      

    【讨论】:

    • 使用您的提示我收到以下错误:NoMethodError (undefined method set_mail_checker' for InstanceMethods::WikiContent:Class)`。我做错了什么?
    • @user2195342,是的,很可能。因为答案中的代码有效。
    • 我忘了提到我的模块中有两个方法。其中一种方法包含在模块中。另一个是上面列出的。我隐藏了另一个只是为了简化问题。
    猜你喜欢
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2014-02-06
    • 2023-03-25
    • 2017-02-12
    相关资源
    最近更新 更多