如果未上传载波图像,则添加默认图像

时间:2019-06-08 06:21:16

标签: ruby-on-rails carrierwave cloudinary

我要添加照片上传器,并且如果未上传用户照片,是否要添加默认图像?想知道我的'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

我没有收到任何错误消息,但是图像上传正常,并且头像进入导航栏,但是如果我不上传图像,则什么也不会出现,并且也不会获取默认的“怪物”图片。

1 个答案:

答案 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 %>
相关问题