使用 carrierwave 设置默认头像

最近项目中需要实现头像上传功能的API接口,并且可以设置默认头像,这篇文章来大概总结一下具体的实现过程。

Rails中 实现图片上传最常用的是使用“gem carrierwave”。
github 地址: carrierwave

Step1

安装gem "carrierwave" gem "mini_magick"

Step2

1
rails g image uploader

这个命令会生成image_uploader.rb这个文件。之后关于图片的设置都需要在这个文件里设置。下面是我设置的配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 class ImageUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick


storage :file

def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end

# 设置图片大小,分为三个尺寸
process resize_to_fit: [800,800]

version :thumb do
process resize_to_fill: [200,200]
end

version :medium do
process resize_to_fill: [400,400]
end

#设置图片的默认url地址,比如我要实现默认头像的设置,就会用到这个方法
def default_url(*args)
"/uploads/tbl_playerinfo/headimg/1/" + [version_name, "14563MHK40-13251.jpg"].compact.join('_')
end

# 图片格式的设置
def extension_whitelist
%w(jpg jpeg gif png)
end
end

Step3

设置model。table中的哪个字段存储图片就需要设置这个字段。

1
2
3
4
class TblPlayerinfo < ApplicationRecord
# headimg 为存储用户头像的字段
mount_upload :headimg, ImageUploader
end

Step4

显示上传图片的url地址,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if @player.present?
@gamer = @player.first
json.code 0
json.msg "已找到该玩家"
json.playerMsg do
json.uid @gamer.userid
json.name @gamer.nickname
json.gold @gamer.gold
json.online true
json.sex @gamer.sex
json.viptype @gamer.account.vip_type
json.headimgurl @gamer.headimg_url
json.score @gamer.score
json.diamond @gamer.diamond
end
else
json.code 1
json.msg "玩家不存在"
end

其中可以使用字段名加url后缀来直接显示图片的url地址。如headimg_url

总结:昨天一直想实现默认头像的功能,起初是在headimg这个字段设置默认值,但是捞出来的url总是错误的。后来仔细看了carrierwave的说明文档,才搞懂该如何设置默认的文件地址。教训:遇到问题要第一时间看官方文档和源代码,相比于在网络上寻找教程不仅可以提高自己的解决问题的效率,而且还能让自己养成看原始文档的好习惯。

补充:

1
2
3
4
class TblPlayerinfo < ApplicationRecord
# headimg 为存储用户头像的字段
mount_upload :headimg, ImageUploader
end

其中headimg字段在数据库中的数据被记录为图片的名称。如果想要直接从数据库中直接获取完整的图片url地址,可以添加一个字段headimg2 用来代替headimg,然后headimg的值可以设置为服务器地址+headimg2, 例如

1
2
3
4
5
6
7
8
9
10
11
12
13
if @player.update(:headimgxf => params[:image])
@player.update( :headimg => "47.100.60.84" + @player.headimgxf.to_s )
json.code 0
json.msg "上传成功"
json.playerMsg do
json.uid @player.userid
json.name @player.nickname
json.headimgurl @player.headimg
end
else
json.code 1
json.msg "上传失败"
end

这样从数据库中捞取headimg字段的数据时就是完整的url地址了。