ruby 如何用方法从gem扩展类?

p8h8hvxi  于 2023-03-12  发布在  Ruby
关注(0)|答案(1)|浏览(144)

尝试扩展(太棒了)(mail gem),但遇到了问题。
邮件可以这样使用:

  • Mail.all
  • Mail.first
  • 邮件.全部删除()

我想把它扩展为:move_all()我看了一下source code,似乎是扩展IMAP〈Retriever类的合适位置,所以它就在旁边;delete_all()。代码也几乎相同。
但我做错了什么,我可以让它工作,这里是consise版本,我想得到工作:

#!/usr/bin/ruby

require 'net/imap'
require 'mail' #https://github.com/mikel/mail

module Mail
    class IMAP < Retriever
    require 'net/imap' unless defined?(Net::IMAP)
    
    
        # Move all emails from an IMAP mailbox to another IMAP mailbox within the same account
        def move_all(mailbox='INBOX', target='')
            puts "How dow we get this to show?"
        end

    end
end

Mail.defaults do
    retriever_method :imap, :address    => MAIL_SERVER,
                            :port       => 993,
                            :user_name  => USERNAME,
                            :password   => PASSWORD,
                            :enable_ssl => true
                                                    
end

# WHY doesn't this work:
#
Mail.move_all('INBOX', 'another_box')
#   ^^^^^^^^^
#   gives error:  undefined method `move_all' for Mail:Module (NoMethodError)

# and does this works: 
Mail.delete_all()

如你所见:Mail.delete_all()运行良好,但IMAP〈Retriever类上的扩展方法'move_all()'无法识别。
我试过的是:

  • 删除“检索器”
  • 用其他方式来称呼这个方法
  • 邮件.检索器.IMAP.全部移动
  • 邮件::检索器.IMAP.移动_全部
  • 等等各种各样的变化。但那是出于绝望。

我需要做什么才能让它工作?
谢谢你的时间和努力干杯

rbl8hiat

rbl8hiat1#

方法Mail.delete_all()在www.example.com中定义https://github.com/mikel/mail/blob/10a4443b9d4ffa71b9ad643ad86cc23ccc99f0f3/lib/mail/mail.rb#L174。您需要在Mail模块中创建类方法move_all

def self.move_all(*args, &block)
    retriever_method.move_all(*args, &block)
  end

相关问题