是否有一种全局方式可以为我的用户邮件程序编写一个before_filter,用于检查用户是否禁用了电子邮件?现在我的每个邮件都检查用户的设置,这是非常多余的。我想通过一个适用于所有邮件程序的before_filter来解决这个问题。
class UserMailer < ActionMailer::Base
before_filter :check_if_we_can_mail_the_user
....
private
def check_if_we_can_mail_the_user
if current_user.mail_me == true
#continue
else
Do something to stop the controller from continuing to mail out
end
end
end
可能?有没有人做过这样的事情?感谢
答案 0 :(得分:29)
Rails 4已经有before_filter和after_filter回调。对于Rails 3用户来说,添加它们非常简单:只需包含AbstractController :: Callbacks。这模仿了change to Rails 4,除了评论和测试之外,还包括Callbacks。
class MyMailer < ActionMailer::Base
include AbstractController::Callbacks
after_filter :check_email
def some_mail_action(user)
@user = user
...
end
private
def check_email
if @user.email.nil?
mail.perform_deliveries = false
end
true
end
end
答案 1 :(得分:6)
我还没有这样做,但我用电子邮件拦截器完成了类似的事情。
class MailInterceptor
def self.delivering_email(message)
if User.where( :email => message.to ).first.mail_me != true
message.perform_deliveries = false
end
end
end
您将无法访问current_user,因此您可以通过电子邮件找到该用户,该用户应该已经在邮件对象中作为“收件人”字段。
有一个很好的Railscast覆盖设置电子邮件拦截器。 http://railscasts.com/episodes/206-action-mailer-in-rails-3?view=asciicast
答案 2 :(得分:0)
也许请查看https://github.com/kelyar/mailer_callbacks。看起来它会做你想做的事。
答案 3 :(得分:0)
我编辑了@naudster的答案以从消息中获取信息
class MyMailer < ActionMailer::Base
include AbstractController::Callbacks
after_filter :check_email
private
def check_email
if message.to.nil?
message.perform_deliveries = false
end
end
end