如何在Rails 4中向控制器添加线程?

时间:2016-11-15 20:20:25

标签: ruby-on-rails multithreading ruby-on-rails-4

我试图更好地理解线程处理过程。我有一个应用程序,无论何时创建新项目都会发送电子邮件,工作正常。我已经能够在create方法中使用sleep来延迟交付。

我想插入一个线程并进行客户端测试。我将初始线程添加到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....

1 个答案:

答案 0 :(得分:4)

没有-NO-禁忌。不,不要这样做。

你不应该使用线程。事实上,在rails应用程序中,您根本不需要使用线程

后台工作人员需要发送延迟的电子邮件。您将电子邮件推送到队列,然后工作人员(另一个进程)选择电子邮件并发送它。

以下是您的一些链接:Sidekiq用于后台作业。 Action Mailer basics指南。

  

我已经能够在create方法中使用sleep来延迟传递。

延迟交货?是的,从某种意义上说。您还推迟了对该请求的整体响应,这正是我们想要延迟发送电子邮件的原因:不要减慢Web请求的速度。