交付与交付之间的差异!方法(Rails 4)

neo*_*eon 3 ruby-on-rails actionmailer ruby-on-rails-4

我通过跟踪和错误注意到

UserMailer.newsletter(@user, @posts).deliver unless @posts.blank?
Run Code Online (Sandbox Code Playgroud)

无论 @post 的值如何,都会发送电子邮件,而

UserMailer.newsletter(@user, @posts).deliver! unless @posts.blank?
Run Code Online (Sandbox Code Playgroud)

如果@posts 为空,(使用deliver! 与deliver)将不会正确发送电子邮件?

为什么是这样?我知道送!如果无法发送,则会抛出异常,但交付不应该也监听条件吗?

Chr*_*ing 5

用于source_location查找定义方法的位置:

UserMailer.newsletter(@user, @posts).method(:deliver).source_location
=> ["gems/mail-2.5.4/lib/mail/message.rb", 229]
Run Code Online (Sandbox Code Playgroud)

这会将您指向邮件 gem 中的这些行,并为您提供答案:

deliver!绕过检查 Perform_delivery 和 raise_delivery_errors。