2016-09-15 21 views
0

アプリケーションでは、サービスに公開ファイルURLをafter_createコールバックで送信したかったのです。だから、コード(簡体字)、このように見えた:私の欲求不満にCarrierwaveはコールバックで実際の代わりにtmpファイルのパスを返します

class UserProfile < ApplicationRecord 
    mount_uploader :video, VideoUploader 
    after_create :send_url_to_service 

    private 

    # Just logs the URL 
    def send_url_to_service 
    Rails.logger.info video.url 
    end 
end 

は、アップロード後、send_url_to_serviceコールバックは常にキャッシュされたファイルのパスをログに記録 - 代わり'uploads/user_profiles/video/1/file.mp4''uploads/tmp/1473900000-123-0001-0123/file.mp4'のようなものを。実際のファイルパスからURLを形成するメソッドを作成しようとしましたが、ファイルがまだ存在しなかったために機能しませんでした。

問題は、このような状況で最終的なファイルURLをどのように取得するかです。

P.Sこれは自己回答の質問です。私は自分の経験を共有したいと思います。

答えて

2

私のためのソリューションは、after_createの代わりにafter_commit ..., on: :createコールバックを使用していた:私はそれうろつい長い時間を無駄にかかわらず

class UserProfile < ApplicationRecord 
    mount_uploader :video, VideoUploader 
    after_commit :send_url_to_service, on: :create 

    private 

    # Just logs the URL 
    def send_url_to_service 
    Rails.logger.info video.url 
    end 
end 

答えは、かなり明白です。説明は簡単です:after_commitすべての情報が正常に保持された後でコールバックが発生します。私の場合、ファイルはストレージディレクトリ(after_create段階)にまだ保存されていませんでした。そのため、実際のファイルの代わりに一時ファイルのURLを取得しました。これが誰かを助け、時間を節約することを願っています。

関連する問題