【问题标题】:Add default image if carrierwave image isn't uploaded如果未上传载波图像,则添加默认图像
【发布时间】:2019-10-23 12:48:45
【问题描述】:

我正在添加照片上传器,如果未上传用户照片,我想添加默认图片?想知道我的“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

这是我的照片上传器

class PhotoUploader < CarrierWave::Uploader::Base
  include Cloudinary::CarrierWave
end

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

【问题讨论】:

    标签: ruby-on-rails carrierwave cloudinary


    【解决方案1】:

    根据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
    

    之后,您应该在assets/images 下创建fallback 文件夹并将default.png 文件放入其中。不要忘记重新启动您的应用程序。

    另外,您应该将 PhotoUploader 安装在您的 User 模型上:

    class User < ApplicationRecord
      mount_uploader :photo, PhotoUploader
      ...
    end
    

    更新

    我之前从未使用过cloudinary gem,但经过一番搜索,我发现了这个blog post

    从#default_public_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 %>
    

    【讨论】:

    • 感谢您的回复。我试了一下,但没有用。我必须对我的 user.rb 文件做些什么吗?
    • ``` after_create :set_photo, :set_balance 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!结束结束```
    • @Michael 你在你的模型上安装了上传器吗?我已经用示例更新了答案。
    • 是的,我也已经这样做了。抱歉,我试图在评论中添加它的代码显然效果不佳
    • @Michael 答案在上传者部分更新。您在开发者工具的图像代码中究竟看到了什么?它是404路径还是空的?我拒绝了您的修改,因为这不是您的问题的原因。
    猜你喜欢
    • 2020-08-16
    • 2018-02-13
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 2011-07-12
    相关资源
    最近更新 更多