6

Rails 3 アプリケーションで Carrierwave と Mongoid を使用していますが、after_save コールバックで問題が発生しています。次のことを考慮してください

class Video
  include Mongoid::Document

  field :name  

  mount_uploader :file, VideoUploader

  after_create :enqueue_for_encoding

  protected

  def enqueue_for_encoding
     // point your encoding service to where it expects the permanent file to reside
     // in my case on s3 
  end

end

私の問題は、私のenqueue_for_encoding方法では、 file.url が s3 ディレクトリではなくローカルの tmp ディレクトリを指していることです。

enqueue_for_encodingfile.url が s3 を指しているときにメソッドを呼び出すにはどうすればよいですか?

ありがとう!

ジョナサン

4

4 に答える 4

2

コールバックに関するcarrierwaveのハウツーページをチェックしてください

https://github.com/jnicklas/carrierwave/wiki/How-to%3A-use-callbacks

それは私のために働いた

于 2012-01-04T11:50:50.753 に答える
1

さて、私はそれを理解しました。少しハッキングしました。そのため、現在、carrierwaveはafter_createフックを公開していません。そのすべてが永続化され、処理はafter_saveコールバックで行われます。これは私がそれを回避するために使用したコードです:

# Video.rb

  mount_uploader :file, VideoUploader

  # overwrite the file setting to flag the model that we are creating rather than saving
  def file=(obj)
    @new_file = true
    super(obj)
  end

  # chain the store_file! method to enqueue_for_encoding after storing the file AND
  # if the file is new
  alias_method :orig_store_file!, :store_file!
  def store_file!
    orig_store_file!
    if @new_file #means dirty
      @new_file = false
      enqueue_for_encoding
    end
    true
  end

アップデート

うわー-それはうまくいきませんでした。ほぼ完了しました。URLは正しいですが、永続的に起動されています。つまり、ファイルはまだロード中であり、enqueue_for_encodingが呼び出されたときに完全には保存されません。

于 2011-03-21T14:40:47.160 に答える
0

モデル内のコールバックを削除after_createして、アップローダーに以下を追加してみてください。

# video_uploader.rb

process :encode

def encode
  model.enqueue_for_encoding
end

processコールバックは、ファイルが保存された後に呼び出されます(私は思う)。これにより、ファイルがS3で起動したときにフックできるようになります。

于 2011-03-19T23:06:56.973 に答える