在应用程序中,我想将公共文件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.请注意,这是一个自我回答的问题,我只想分享我的经验。
答案 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而不是实际文件。希望这可以帮助某人并节省他们的时间。