我要添加照片上传器,并且如果未上传用户照片,是否要添加默认图像?想知道我的'if'语句出了什么问题。
我刚刚离开编码训练营,所以请原谅新手代码。为此提前道歉。该图像显示在我的导航栏中,如果我上传它,但是如果我不上传它,则在我的导航栏中什么也不会显示。
这是我的user.rb文件
class User < ApplicationRecord
def set_photo
if self.photo.nil?
@photos = ['monsters/1', 'monsters/2', 'monsters/3', 'monsters/4', 'monsters/5', 'monsters/6', 'monsters/7', 'monsters/8']
self.photo = @photos.sample
self.save!
end
end
这是我的导航栏
<% if user_signed_in? %>
<li class="nav-item dropdown">
<%= cl_image_tag current_user.photo, class: "avatar dropdown-toggle", id: "navbarDropdown", data: { toggle: "dropdown" }, 'aria-haspopup': true, 'aria-expanded': false %>
这是我的用户控制器
class UsersController < ApplicationController
def new
end
def show
end
def dashboard
@group = Group.new
@user_group = UserGroup.new
@user_groups = current_user.user_groups
@groups = current_user.groups
@user = current_user
end
def update
current_user.available_balance += params[:user][:deposit].to_f unless params[:user][:deposit].nil?
current_user.available_balance -= params[:user][:withdrawal].to_f unless params[:user][:withdrawal].nil?
current_user.save!
redirect_to dashboard_path
end
private
def user_params
params.require(:user).permit(:first_name, :last_name, :photo)
end
end
这是我的PhotoUploader
class PhotoUploader < CarrierWave::Uploader::Base
include Cloudinary::CarrierWave
end
我没有收到任何错误消息,但是图像上传正常,并且头像进入导航栏,但是如果我不上传图像,则什么也不会出现,并且也不会获取默认的“怪物”图片。
答案 0 :(得分:0)
根据official carrierwave documentation,您应该提供default_url
,如下所示:
class MyUploader < CarrierWave::Uploader::Base
def default_url(*args)
"/images/fallback/" + [version_name, "default.png"].compact.join('_')
end
end
对于您的情况,看起来可能是这样:
class PhotoUploader < CarrierWave::Uploader::Base
def default_url(*args)
ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
end
end
之后,您应该在fallback
下创建assets/images
文件夹,并将default.png
文件放入其中。不要忘记重新启动应用程序。
此外,您应该在PhotoUploader
模型上安装User
:
class User < ApplicationRecord
mount_uploader :photo, PhotoUploader
...
end
更新
我以前从未使用过cloudinary
宝石,但经过一番搜索,我发现了这个blog post
从#default_public_id中,您应该返回一个已经存在的公共ID 上传的图片,例如“头像”。
#default_url方法可让您指定要使用的URL,跳过 完全使用Cloudinary,因此您可以在项目中使用资产。
最后要注意的一点是,当您在视图中使用图像时, 必须在您的版本上调用#url,否则默认值将不会被使用。
示例:
class Client::HeadshotUploader < CarrierWave::Uploader::Base
include Cloudinary::CarrierWave
version :circle do
cloudinary_transformation format: :png, transformation: [
{effect: :improve},
{width: 300, height: 300, crop: :thumb, gravity: :face, radius: :max}
]
end
def default_public_id
'headshot'
end
end
然后在您看来
<%= cl_image_tag client.headshot.circle.url %>