载波的后备图像

use*_*865 2 ruby-on-rails carrierwave

我的上传者除了一件小事外还能很好地工作.默认图像的设置.我正在使用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
Run Code Online (Sandbox Code Playgroud)

图像模型

class Image <ActiveRecord :: Base

class Image < ActiveRecord::Base

    mount_uploader :file_name, AvatarUploader, auto_validate: false

    belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

头像上传者

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
Run Code Online (Sandbox Code Playgroud)

当用户在没有上传可选配置文件图像的情况下注册时,会为它们分配与其配置文件图像的关联,但是它们不是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
Run Code Online (Sandbox Code Playgroud)

图像模型

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
Run Code Online (Sandbox Code Playgroud)

虽然它几乎可以工作,当我更新file_name列的属性时,上传器会启动并被my_fallback.jpg我的random_string方法中的随机字符串覆盖!

Kir*_*rat 5

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

更新您的default_url方法AvatarUploader如下:

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

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

请参阅Carrierwave文档中提供默认URL一节.

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

发生这种情况是因为您已经重写了filename方法,AvatarUploader每次上传图像时都会调用它.如果你注意到它的调用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
Run Code Online (Sandbox Code Playgroud)

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