gpt4 book ai didi

ruby-on-rails - 带 Carrierwave 的后备图像

转载 作者:行者123 更新时间:2023-12-02 04:31:37 26 4
gpt4 key购买 nike

除了一件小事之外,我的 uploader 运行良好。默认图像的设置。我使用 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 < 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工作时,他们从文件名方法中获得一个随机字符串。

我想我可以这样解决它:

用户模型

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 列的属性时, uploader 启动并 my_fallback.jpg被我的 random_string 中的随机字符串覆盖方法!

最佳答案

Carrierwave 有一个内置的默认图像回退机制

更新 AvatarUploader 中的 default_url 方法,如下所示:

  def default_url
ActionController::Base.helpers.asset_path("fallback/" + [version_name, "my_fallback.jpg"].compact.join('_'))
end

fallback/ 更改为您所需的文件夹路径。这样,当没有为特定用户上传 avatar 时,my_fallback.jpg 将用作后备图像。

请参阅部分Providing a default URL 在 Carrierwave 文档中。

when I update the attributes of the file_name column, the uploader kicks in and my_fallback.jpg is overridden by a random string from my random_string method!

发生这种情况是因为您覆盖了 AvatarUploader 中的 filename 方法,每次上传图像时都会调用该方法。如果您注意到,它会调用其中的 random_string 方法。因此,您将获得一个随机字符串作为文件名。

更新

根据与 OP 的聊天 session ,如果未上传用户的头像,则应显示默认图像。我建议使用以下助手:

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

在 View 中使用此辅助方法来正确显示头像图像。

关于ruby-on-rails - 带 Carrierwave 的后备图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22946123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com