载波的后备图像

时间:2014-04-08 19:09:18

标签: 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

图片模型

class Image&lt;的ActiveRecord ::基

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工作,而是从文件名方法中获取随机字符串。

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

用户模型

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 个答案:

答案 0 :(得分:5)

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

更新default_url中的AvatarUploader方法,如下所示:

  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列的属性时,上传者   kicks in和my_fallback.jpg被我的随机字符串覆盖   random_string方法!

这是因为您在filename中覆盖了AvatarUploader方法,每次上传图片时都会调用该方法。如果你注意到,它在其中调用了random_string方法。因此,您的文件名为random string

<强>更新

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

在视图中使用此辅助方法可以正确显示头像图像。

答案 1 :(得分:0)

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

c = getchar()