我的上传者除了一件小事之外还能很好地工作 . 默认图像的设置 . 我正在使用carrierwave为用户上传他们自己的 Profiles 图片:
用户模型
class User < ActiveRecord::Base
has_one :avatar, class_name: 'Image', foreign_key: :user_id
before_create :create_fallback_image
def create_fallback_image
self.create_avatar
end
end
图像模型
class Image <ActiveRecord :: Base
mount_uploader :file_name, AvatarUploader, auto_validate: false
belongs_to :user
end
头像上传者
class AvatarUploader < BaseUploader
include CarrierWave::RMagick
storage :file
process resize_to_fit: [75, 75]
process convert: 'gif'
def default_url
'foobar'
end
def filename
random_string + '.gif'
end
end
def random_string
@random_string ||= User.random_string
end
end
当用户在没有上传可选配置文件图像的情况下注册时,会为他们分配与其配置文件图像的关联,但不是 default_url
工作,而是从filename方法获取随机字符串 .
我以为我可以像这样绕过它:
用户模型
class User < ActiveRecord::Base
has_one :avatar, class_name: 'Image', foreign_key: :user_id
before_create :create_fallback_image
def create_fallback_image
# look here:
self.create_avatar.create_fallback
end
end
图像模型
class Image < ActiveRecord::Base
mount_uploader :file_name, AvatarUploader, auto_validate: false
belongs_to :user
def create_fallback
self.update_attributes(file_name: 'my_fallback.jpg')
end
end
当它几乎可以工作时,当我更新file_name列的属性时,上传器启动并且 my_fallback.jpg
被我的 random_string
方法中的随机字符串覆盖!
2 回答
Carrierwave
具有默认图像的内置回退机制更新
AvatarUploader
中的default_url
方法,如下所示:将
fallback/
更改为所需的文件夹路径 . 这样,当没有为特定用户上传avatar
时,my_fallback.jpg
将用作后备图像 .请参阅Carrierwave文档中的 Providing a default URL 部分 .
发生这种情况是因为您在
AvatarUploader
中覆盖了filename
方法,每次上传图像时都会调用该方法 . 如果你注意到,它在其中调用了random_string
方法 . 因此,您获得random string
作为您的文件名 .UPDATE
根据与OP的聊天会话,如果没有为用户上传化身,则应该显示默认图像 . 我建议了以下帮手:
在视图中使用此辅助方法可以适当地显示头像图像 .
此外,您可以在模型中执行此操作: