How to add a before_filter in UserMailer which che

2020-04-01 08:44发布

is there a global way I can write a before_filter for my user mailer, that checks to see if the user has emails disabled? Right now every mailer I have checks the user's setting, this is very redundant. I would like to DRY this up by having a before_filter that works for all mailers.

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

Possible? Has anyone done something like this? Thanks

4条回答
家丑人穷心不美
2楼-- · 2020-04-01 09:04

I haven't done this, but I've done similar things with an email interceptor.

class MailInterceptor    
    def self.delivering_email(message)
        if User.where( :email => message.to ).first.mail_me != true
            message.perform_deliveries = false
        end
    end
end

You won't have access current_user, so you find the user by email, which should already be in the mail object as the 'to' field.

There's a good Railscast covering setting up email interceptors. http://railscasts.com/episodes/206-action-mailer-in-rails-3?view=asciicast

查看更多
太酷不给撩
3楼-- · 2020-04-01 09:22

Rails 4 already has before_filter and after_filter callbacks. For Rails 3 users, it's surprisingly simple to add them: just include AbstractController::Callbacks. This mimics the change to Rails 4 which apart from comments and tests, just included 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
查看更多
▲ chillily
4楼-- · 2020-04-01 09:25

Maybe check out https://github.com/kelyar/mailer_callbacks. It looks like it will do what you want.

查看更多
爱情/是我丢掉的垃圾
5楼-- · 2020-04-01 09:25

I edited @naudster 's answer to get the information from message

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
查看更多
登录 后发表回答