2016-11-15 70 views
0

我想更好地理解線程過程。每當創建新項目時,我都有一個應用程序提供電子郵件,工作正常。我已經能夠在創建方法中使用sleep來延遲交付。如何將線程添加到Rails 4中的控制器?

我想插入一個線程並進行客戶端測試。當我將初始線程添加到create方法時,我收到了一個Template is missing錯誤。

items_controller.rb

class ItemsController < ApplicationController 
    def create 
    @user = User.find(params[:user_id]) 
    @item = @user.items.create(item_params) 

    Thread.new do 
     respond_to do |format| 
     if @item.save 
      format.html { redirect_to_user_path(@user), notice: 'Item was created successfully.' } 
     else 
      format.html { redirect_to_user_path(@user), notice: 'Item was NOT created successfully.' } 
     end 
     end 

     PlayMailer.sample_email(@user).deliver 

     @user.status = "Delivered" 
     @user.save 

     sleep 60 
    end 
    end 

    private.... 

回答

4

無無無無。不,不要這樣做。

您不應該爲此使用線程。事實上,在Rails應用程序中,您不需要使用線程,所有

延遲郵件需要由後臺工作人員發送。您將電子郵件推送到隊列中,然後稍後工作人員(另一個進程)挑選電子郵件併發送。

以下是您的一些鏈接:Sidekiq適用於後臺作業。 Action Mailer basics指南。

我已經能夠在創建方法中使用sleep來延遲發送。

延期交貨?是的,從某種意義上說。您還延遲了對該請求的整個響應,這正是我們爲什麼要做延遲電子郵件:不減慢網絡請求的原因。

+0

除了Sidekiq,如果工作不是關鍵任務(不需要保證交付),你可以考慮[Sucker Punch](https://github.com/brandonhilkert/sucker_punch)。 –

相關問題