2013-09-17 8 views
1

Я имею в виду Agile веб-разработки с 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 <[email protected]>' 


    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 

Я сделал вышеуказанные изменения в мой код,

Это поднять ошибку с рабочими местами рек: работа

[Worker(pid:8300)] Starting job worker [Worker(pid:8300)] Job OrderNotifier#shipped_without_delay (id=31) RUNNING [Worker(pid:8300)] Job OrderNotifier#shipped_without_delay (id=31) FAILED (0 prior attempts) with NoMethodError: undefined method []' 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 []' for nil:NilClass [Worker(pid:8300)] 1 jobs processed at 6.3007 j/s, 1 failed

ответ

2

Вы не можете обрабатывайте это в своем контроллере, иначе процесс ruby ​​будет заблокирован в течение 5 минут :-). Вы должны использовать что-то похожее на драгоценный камень delayed_job, доступный на github: https://github.com/collectiveidea/delayed_job - этот драгоценный камень потрясающий и идеально подходит для таких ситуаций. Простой просмотр readme на странице github.

1

Mattherick правильный - это должно быть обработано вне вашего контроллера. Но я бы очень рекомендовал Sidekiq над DelayedJob. Он может обрабатывать гораздо больший объем заданий, и я нашел его более стабильным.

https://github.com/mperham/sidekiq

И для отправки в частности, см https://github.com/mperham/sidekiq/wiki/Delayed-Extensions.

Смежные вопросы