论坛首页 编程语言技术论坛

rails3中使用delayed_job异步发送邮件的方法

浏览 3674 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-05-23  
railscasts有个视频,使用delayed_job去发送邮件(http://railscasts.com/episodes/171-delayed-job)

但是呢,rails3的发送邮件的api发生了些许变化。(详情请看:http://lindsaar.net/2010/1/26/new-actionmailer-api-in-rails-3)
发送的方法上也要做些许的修改。这里以我的代码作为示例,做个示范。
这里的UserMailer大概代码:
class UserMailer < ActionMailer::Base
  default :from => "admin@example.com"

  def registration_confirmation(user)
    @user = user
    mail(:to => "#{user.username} <#{user.email}>", :subject => "注册确认")
  end
end

这个是rails3的ActionMailer,很赞

有了上面的代码,Controller中直接调用
UserMailer.registration_confirmation(@user).deliver
就可以发送邮件了
  def create
    @user = User.new(params[:user])
    if @user.save
      UserMailer.registration_confirmation(@user).deliver
      flash[:notice] = "谢谢您的注册,一封注册确认邮件即将发往邮箱#{@user.email},请注意查收!"
      redirect_to '/login'
    else
      render :action => 'new'
    end
  end

但是,现在的代码是直接进行发送的,这使得用户在操作的时候,会卡一下,如果放到后台去发送就不会有这个问题。

在rails的lib目录底下的mailing_job.rb文件内容,做些许的变化
class MailingJob < Struct.new(:notifier_method,:user_id)
  def perform
    user = User.find(user_id)
    UserMailer.send(notifier_method, user).deliver
  end
end


到这里就基本上搞定了,把UserController里的直接发送的代码换成:
Delayed::Job.enqueue MailingJob.new(:registration_confirmation, @user.id)


delayed_job记得上最新版,gemfile里直接写gem "delayed_job", "2.1.0.pre"就可以了
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics