你使用File.open
会工作的解决方案,但你应该验证名称是File.basename
有效,以便有人能不能通过../../secret_credentials.yml
和暴露你不希望他们的信息。同时检查它与预设图像列表将是一个好主意。
但是,在这种情况下,您可以通过跳过CarrierWave更高效地完成此操作。
添加一个新字段,名为library_image
,当有人想要使用预设图像时,则您设置library_image
,如果他们想使用自己的照片,请取消设置library_image
并正常上传照片。然后添加一个辅助方法,如:
def avatar_url
if self.library_image?
"http://example.com/images/#{self.library_image}"
else
self.picture.url
end
end
这是假设你可以在http://example.com/images/[name]
找到预设的图像,并且使用mount_uploader
在CarrierWave命名picture
。
现在任何时候你想要显示他们的图片,你会打电话avatar_url
,这将检查它是否应该返回预设的URL,或他们上传的图片。
你将如何更新library_image
或picture
一个例子根据你原来的问题:
if params[:file].is_a?(Hash)
model.library_image = params[:file][:url]
model.remove_picture = true
else
model.library_image = nil
model.picture = params[:file]
end
我如何可以检测到用户上传新的图片?我的意思是,我应该写入什么回调函数名称来重置library_image?谢谢! – CamelCamelCamel 2012-08-08 06:08:09
@CamelCamelCamel我用一个例子更新了我的原始答案。 – 2012-08-08 18:46:37
如何根据avatar_url将文件作为预设或文件返回? – CamelCamelCamel 2012-08-13 03:57:21