根据性别设置默认图片 - Carrierwave & Device

Set Default Image According To Gender - Carrierwave & Device

我使用 carrierwave 上传图片,但由于我无法在 image_uploader.rb 中访问 devise gem 的变量 'current_user',所以我无法根据性别设置默认图片图片 url 为 nil(创建或更新后),有解决办法吗?

uploaders/image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base
 def default_url
  if (current_user.gender == "Male")
   ActionController::Base.helpers.asset_path("fallback/" + [version_name, "male.PNG"].compact.join('_'))
  else
   ActionController::Base.helpers.asset_path("fallback/" + [version_name, "female.PNG"].compact.join('_'))
  end
 end
end

如果 image_uploader.rb 是一个模块,使用回调(例如 after_create)在您的 User.rb 模型中调用它,传递用户对象并根据用户的性别设置图像。

像这样:

class User < ActiveRecord::Base
  after_create :set_default_url!

  def set_default_url!
    url = ImageUploader.default_url(gender)
    update!(url: url)
  end
end

然后,在您的模块中:

class ImageUploader < CarrierWave::Uploader::Base
  def self.default_url(gender)
    ActionController::Base.helpers.asset_path("fallback/" + [version_name, "#{gender.downcase}.PNG"].compact.join('_'))
  end
end

为简洁起见,显然省略了一些代码。

解决方法是在app/assets/images

下添加两张照片"male/female.png"

然后在helpers/application_helper创建这个方法

def default_img(user)
  if user.avatar_url.nil?           
    if (user.gender == "Male")
         "male.PNG"
    else
        "female.PNG"
    end
  else
    user.avatar_url
  end
end

然后对每个 img_tag

使用此方法