首页 文章

载波的后备图像

提问于
浏览
2

我的上传者除了一件小事之外还能很好地工作 . 默认图像的设置 . 我正在使用carrierwave为用户上传他们自己的 Profiles 图片:

用户模型

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 工作,而是从filename方法获取随机字符串 .

我以为我可以像这样绕过它:

用户模型

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 方法中的随机字符串覆盖!

2 回答

  • 5

    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 将用作后备图像 .

    请参阅Carrierwave文档中的 Providing a default URL 部分 .

    当我更新file_name列的属性时,上传器启动并且my_fallback.jpg被来自random_string方法的随机字符串覆盖!

    发生这种情况是因为您在 AvatarUploader 中覆盖了 filename 方法,每次上传图像时都会调用该方法 . 如果你注意到,它在其中调用了 random_string 方法 . 因此,您获得 random string 作为您的文件名 .

    UPDATE

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

    在视图中使用此辅助方法可以适当地显示头像图像 .

  • 0

    此外,您可以在模型中执行此操作:

    class User < ApplicationRecord
      has_one :avatar, class_name: 'User::Avatar', as: :parent, dependent: :destroy
      accepts_nested_attributes_for :avatar, allow_destroy: true #, ...
    
      def avatar
        super || build_avatar
      end
    end
    

相关问题