作者godfat (godfat 真常)
看板Ruby
标题Re: [问题] 无法呼叫成员函式?
时间Tue May 12 02:11:08 2009
吧,对不起推文推太长了...
※ 引述《prelight (失败者)》之铭言:
: 环境:Ruby 1.8.6 Rails 2.3.2
:
: 状况:依照这一篇文章http://0rz.tw/MzM5Q去实做,因为一直无法run起来(没有error)
: 但是无法将资料新增到database,以下为简化的code(排错0rz)
: 在 app/models/mail_reader.rb中
: # app/models/mail_reader.rb
: require 'net/pop'
:
: class MailReader < ActionMailer::Base
: def receive(email)
^^^^^^^
这是 MailReader 的 instance method
: p "kerkerker"
: #Q:这行都不会被执行0rz,不知道为什麽?
: task = Task.new({:name => email.subject, :description => email.body})
: end
[略]
: mail = TMail::Mail.parse(email.pop)
: p "Zeeee~~~"
: MailReader.receive(mail)
^^^^^^^^^^^^^^^^^^
这是 MailReader 的 class method (先这样理解,事实上 class method
也是一种 instance method.)
: 目前就是确定有信的话他真的会印出Zeeee~~~,而且可以正确印出header等讯息(有先
: debug)但是没办法印出receive里面的kerkerker 0rz,不知道为什麽?想请教依下大
: 家
所以我这边才会说:
: → godfat:instance method 和 class method 的差别 05/12 01
: → godfat:网页我现在读不出来..MailReader.receive(m)是class method 05/12 01
: → godfat:你定义 def receive 是 instance method, 本不会被呼叫 05/12 01
你在 MailReader.check_mail 里面用 MailReader.receive,
本来就不应该呼叫的 MailReader 的 instance method,
所以 科科 没出来,是正常的。但你现在好像没问题了,
那可能又是 rails 的 magic 吧,那我就不熟罗...
而根据这边:
http://api.rubyonrails.org/classes/ActionMailer/Base.html
Public Class methods: receive(raw_email)
If you want your mailer to be able to process incoming messages,
you'll need to implement a receive method that accepts the email
object as a parameter.
意思就是 ActionMailer::Base 有个 class method 是 receive,
而这 method 底下又会呼叫 instance method receive, 看他 source code:
413: def receive(raw_email)
414: logger.info "Received mail:\n #{raw_email}" unless logger.nil?
415: mail = TMail::Mail.parse(raw_email)
416: mail.base64_decode
417: new.receive(mail)
418: end
最下面是 new.receive(mail), 因此他在这里面产生新的 ActionMailer::Base,
也就是你的 MailReader, 然後才呼叫你的 MailReader 的 instance method receive
如果你的 科科 没有被印出来,可能就是上面有 exception,
所以你的 receive 就被跳过去了。
==
补个结论,所以是不用加 self 没错,网页应该没写错(虽然我现在看不到)
只是要记得 MailReader.receive 并不会直接呼叫到你定义的 receive,
中间还有转过一手,如果你的 receive 没被叫到,要检查中间是谁转手的。
--
「行け!Loki!」
(rocky ロッキー)
-Gurumin ぐるみん 王子? XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.28.18
※ 编辑: godfat 来自: 220.135.28.18 (05/12 02:14)
1F:→ prelight:感谢大大无私解惑 谢谢你:) 05/12 12:13
2F:→ prelight:我还是老实的找本Ruby的书看一下相关的章节好了:) 05/12 12:22
3F:→ godfat:不谢,有其他问题欢迎来板上问 XD 05/12 14:11