Carrierwave在回调

时间:2016-09-15 14:57:09

标签: ruby-on-rails rails-activerecord carrierwave

在应用程序中,我想将公共文件URL发送到after_create回调中的服务。所以,代码(简化)看起来像这样:

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/tmp/1473900000-123-0001-0123/file.mp4'而不是'uploads/user_profiles/video/1/file.mp4'。我尝试编写一个方法来从实际的文件路径中形成URL,但它没有用,因为文件还没有。

所以,问题是,在这种情况下如何获得最终文件URL?

P上。 S.请注意,这是一个自我回答的问题,我只想分享我的经验。

1 个答案:

答案 0 :(得分:5)

我的解决方案是使用after_commit ..., on: :create回调代替after_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而不是实际文件。希望这可以帮助某人并节省他们的时间。