我的上传器除了一件小事外还能很好地工作。默认图像的设置。我使用carrierwave为用户上传他们自己的个人资料图片:
用户模型
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&lt;的ActiveRecord ::基
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
工作,而是从文件名方法中获取随机字符串。
我以为我可以像这样绕过它:
用户模型
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
方法中的随机字符串覆盖!
答案 0 :(得分:5)
Carrierwave
具有内置的默认图像回退机制
更新default_url
中的AvatarUploader
方法,如下所示:
def default_url
ActionController::Base.helpers.asset_path("fallback/" + [version_name, "my_fallback.jpg"].compact.join('_'))
end
将fallback/
更改为所需的文件夹路径。
这样,如果没有为特定用户上传avatar
,则my_fallback.jpg
将用作后备图片。
请参阅Carrierwave文档中的 Providing a default URL 部分。
当我更新file_name列的属性时,上传者 kicks in和my_fallback.jpg被我的随机字符串覆盖 random_string方法!
这是因为您在filename
中覆盖了AvatarUploader
方法,每次上传图片时都会调用该方法。如果你注意到,它在其中调用了random_string
方法。因此,您的文件名为random string
。
<强>更新强>
根据与OP的聊天会话,如果没有为用户上传头像,则应显示默认图像。我建议了以下帮手:
module ApplicationHelper
def display_avatar(user)
unless user.avatar.nil?
image_tag(user.avatar.file_name)
else
image_tag("/path/to/fallback.jpg")
end
end
## ...
end
在视图中使用此辅助方法可以正确显示头像图像。
答案 1 :(得分:0)
此外,您可以在模型中执行此操作:
c = getchar()