使用carrierwave_backgrounder以及carrierwave-video,电子邮件通知

时间:2013-01-31 15:00:29

标签: ruby-on-rails-3 actionmailer carrierwave

我配置了自己的网站,以便在后台自动呈现不同版本的视频。它实际上工作得很好。如果视频在三种不同的转码中成功,它将发送成功的电子邮件。但是,如果它生成错误,它将发送失败的电子邮件。我遇到的问题是我试图将自我传递给Action Mailer,这样我至少可以给出成功或失败的视频名称。但是,看起来self是空的。

模型

  def video_success(format, opts)
    VideoMailer.video_success(self).deliver
  end
  def video_rescue(format, opts)
    VideoMailer.video_error(self).deliver
  end

上载

version :mp4 do
    process :encode_video => [:mp4, callbacks: {rescue: :video_rescue}  ]
    def full_filename(for_file)
      "#{File.basename(for_file, File.extname(for_file))}.mp4"
    end
end


version :webm do
    process :encode_video => [:webm, callbacks: { after_transcode: :video_success, rescue: :video_rescue }]
    def full_filename(for_file)
      "#{File.basename(for_file, File.extname(for_file))}.webm"
    end
end

有关如何实现这一点的任何想法?此外,如果出现错误,最好返回生成的错误消息。

其次,每个用户模型都有一个电子邮件地址。上传视频的用户应该会收到电子邮件地址。但是,我在模型中使用current_user时遇到问题。我认为它也与背景资料有关,因为该信息不会传递给后台进程。

1 个答案:

答案 0 :(得分:2)

我在后台处理器的末尾添加了一个类方法

process_in_background :video, ParanoidVideo

在models目录中,我创建了paranoid_video.rb并引用了邮件的传递。这样,Carrierwave_Backgrounder正在处理成功方法而不是Carrierwave-Video。

class ParanoidVideo < ::CarrierWave::Workers::ProcessAsset
  def success(job)
    VideoMailer.video_backgrounder(job).deliver
  end
end

我最终在数据库中创建了一个名为last_updated_by的新字段,并使用它来返回正在调用的用户。当然,这是在拉动用户时对数据库的额外调用,但我发现这足以满足我的目的。后台处理器静态返回一致的处理程序,因此我只能拆分行和gsub来获取ID。 to_i将拉出第一个数值,在我的情况下,它始终是视频ID。

  def video_backgrounder(job)
    @job = job
    @video = Video.find_by_id(@job.handler.split("\n")[2].gsub("id: '","").to_i)
    @user = User.find_by_id(@video.last_updated_by)
    mail(:to => @user.email, :subject => "Video Transcoding Successful")
  end