1

さまざまなバージョンのビデオをバックグラウンドで自動的にレンダリングするようにサイトを構成しました。それは実際に本当にうまく機能しています。ビデオが3つの異なるトランスコードで成功すると、成功の電子メールが送信されます。ただし、エラーが発生した場合は、失敗メールが送信されます。私が抱えている問題は、少なくとも成功または失敗したビデオの名前を付けることができるように、アクションメーラーに自分自身を渡そうとしていることです。ただし、selfはnullのようです。

モデル

  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を使用すると問題が発生します。その情報はバックグラウンドプロセスに渡されないので、バックグラウンダーにも関係があると思います。

4

1 に答える 1

2

バックグラウンドプロセッサの最後にクラスメソッドを追加しました

process_in_background :video, ParanoidVideo

モデルディレクトリparanoid_video.rbで、メールの配信を作成して参照しました。このように、Carrierwave_BackgrounderはCarrierwave-Videoの代わりにsuccessメソッドを処理します。

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

と呼ばれるデータベースに新しいフィールドを作成し、last_updated_byこれを使用して、呼び出されているユーザーを返しました。確かに、これはユーザーがプルされているときのデータベースへの追加の呼び出しですが、これは私の目的には十分であることがわかりました。バックグラウンドプロセッサは静的に一貫性のあるハンドラーを返すので、IDを取得するために行とgsubを分割することができました。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
于 2013-02-07T13:30:13.600 に答える