CarrierWave如何在给定的URL上存储文件

Mar*_*arc 20 ruby-on-rails carrierwave

我通过典型的ORM设置使CarrierWave正常工作并通过表单上传.我想弄清楚如何在表单提交上下文之外使用CarrierWave.例如,当用户注册时,我想抓住他们的gravatar并将其存储在CarrierWave中.这是我拥有的,它不起作用:

gravatar_url = "http://www.gravatar.com/avatar/#{Digest::MD5.new.update(current_user.email)}?s=512&d=identicon"

uploader = ImageUploader.new
uploader.store! gravatar_url
Run Code Online (Sandbox Code Playgroud)

也没有错误.我一直在寻找网络,但一直无法找到解决方案.

Nur*_*iel 45

在用户注册后在控制器中(假设您的用户图像字段仅称为"图像")

gravatar_url = "http://www.gravatar.com/avatar/#{Digest::MD5.new.update(current_user.email)}?s=512&d=identicon"
@user.remote_image_url = gravatar_url
@user.save 
Run Code Online (Sandbox Code Playgroud)

我认为这是根据carrierwave文档和一些搜索的最佳方式.

请享用!

  • 很高兴我能帮助你!从社交或任何服务apis导入时,这是一个非常有用的方法. (2认同)

Chr*_*ola 19

实际上,remote_{attribute}_url如果您使用的是活动记录/模型帮助程序,则可以使用内置属性执行此操作(有关详细信息,请参阅CarrierWave railscast).但是,我在源代码中挖了一下,看看这实际上是如何工作的,看起来即使你不是,你也应该能够使用以下内容:

uploader = ImageUploader.new
uploader.download! some_remote_url
uploader.store!
Run Code Online (Sandbox Code Playgroud)

试试看.


kei*_*ley 17

我在尝试弄清楚如何store!使用本地文件路径方面遇到了很多麻烦.事实证明,store!实际上将文件作为参数而不是字符串.

对于URL,您需要require 'open-uri'先打开文件/网址.这样的事情应该有效:

require 'open-uri'
gravatar_url = "http://www.gravatar.com/avatar/#{Digest::MD5.new.update(current_user.email)}?s=512&d=identicon"
tempfile = open(gravatar_url)    

uploader = ImageUploader.new
uploader.store! tempfile
Run Code Online (Sandbox Code Playgroud)

这同样适用于文件路径,但open-uri在这种情况下您不必要求.