如何在发送电子邮件之前添加延迟?

时间:2013-09-17 15:23:26

标签: ruby-on-rails-3 delayed-job

我指的是使用Rails第4版的敏捷网络开发。我先创建了两个电子邮件通知,用于确认订单,第二个用于发货订单。现在我想在向用户发送“订单确认”邮件后再添加5分钟的延迟,然后发送第二个“已发货订单”电子邮件。 目前我有这两个文件,告诉我应该做些什么改变来增加所需的延迟。

提前致谢。

orders_controller.rb

def create

    @order = Order.new(params[:order])
    @order.add_line_items_from_cart(current_cart)

    respond_to do |format|
      if @order.save
        Cart.destroy(session[:cart_id])
        session[:cart_id] = nil
        OrderNotifier.received(@order).deliver
        #Mail after 5 miutes to inform order is Shipped
        OrderNotifier.delay.shipped(@order)
        format.html { redirect_to store_url, notice: I18n.t('.thanks') }
        format.json { render json: @order, status: :created, location: @order }
      else
        @cart = current_cart
        format.html { render action: "new" }
        format.json { render json: @order.errors, status: :unprocessable_entity }
      end
    end
  end

order_notifier.rb

class OrderNotifier < ActionMailer::Base

  default from: 'sam ruby <depot@example.com>'


  def received(order)
    @order = order
    mail to: order.email, subject: 'Pragmatic Store Order Confirmation'
  end


  def shipped(order)
    @order = order
    mail to: order.email, subject: 'Pragmatic Store Order Shipped'
  end
  handle_asynchronously :shipped, :run_at => Proc.new { 5.minutes.from_now }
end

我对我的代码进行了上述更改,

使用rake作业引发错误:工作

  

[工人(pid:8300)]起薪工人[工人(工资:8300)]工作   OrderNotifier#shipped_without_delay(id = 31)RUNNING [Worker(pid:8300)]   Job OrderNotifier#shipped_without_delay(id = 31)FAILED(0之前   尝试)与NoMethodError:未定义的方法[]' for nil:NilClass [Worker(id:8300)] 1 jobs processed at 1.5796 j/s, 1 failed [Worker(pid:8300)] Job OrderNotifier#shipped_without_delay (id=31) RUNNING [Worker(pid:8300)] Job OrderNotifier#shipped_without_delay (id=31) FAILED (1 prior attempts) with NoMethodError: undefined method []'为nil:NilClass [Worker(pid:8300)] 1个工作在6.3007处理   j / s,1失败

2 个答案:

答案 0 :(得分:2)

您无法在控制器中处理,否则ruby进程将被阻止5分钟:-)。你应该使用类似delayed_job gem的东西,可以在github上找到:https://github.com/collectiveidea/delayed_job - 这个宝石很棒,非常适合这种情况。简单查看github页面上的自述文件。

答案 1 :(得分:1)

马特塞克是正确的 - 这必须在您的控制器之外处理。但我强烈推荐Sidekiq而不是DelayedJob。它可以处理更多的工作,我发现它更稳定。

https://github.com/mperham/sidekiq

有关具体发送,请参阅https://github.com/mperham/sidekiq/wiki/Delayed-Extensions