【问题标题】:Carrierwave blocks attribute change?载波块属性改变?
【发布时间】:2016-11-15 06:39:21
【问题描述】:

我在我的应用程序中实现omniauth-facebook 时发现了这个问题。我可以使用 facebook 图表哈希来更新我的用户名和他们的电子邮件,但不能更新照片属性。

当我尝试更改用户的照片(字符串)属性时,它总是将值更新为 nil:

@user.update_attributes!(photo: "blah")
   (0.5ms)  BEGIN
  SQL (0.7ms)  UPDATE "users" SET "photo" = $1, "updated_at" = $2 WHERE "users"."id" = $3  [["photo", nil], ["updated_at", "2016-07-12 20:43:30.322405"], ["id", 31]]
   (3.0ms)  COMMIT
 => true 

我有一个照片上传器安装到我的模型/User.rb:

mount_uploader :photo, PhotoUploader

并实现(uploaders/photo_uploader.rb):

class PhotoUploader < CarrierWave::Uploader::Base


  include Cloudinary::CarrierWave
  # Create different versions of your uploaded files:
  version :header do
    process :resize_to_fill => [150, 150]
  end

  version :medium do 
    process resize_to_fill: [100,100]
  end
  version :micro do 
    process :resize_to_fill => [30, 30]
  end
  ...

我相信 Cloudinary 是原因,因为我可以手动更新任何其他属性而不会出现问题。如何覆盖此行为?

下面是我根据 Facebook 的回调哈希(我发现问题的地方)设置 user.photo 的方法。 cloudinary 哈希返回一个 url 作为字符串就好了;这不是 auth.info.image 或 cloudinary 上传响应的问题。

def self.from_omniauth(auth)
      puts auth
      where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
        user.email = auth.info.email
        user.first_name = auth.info.first_name  
        cloudinary_hash = Cloudinary::Uploader.upload(auth.info.image)
        user.photo = cloudinary_hash["url"]
        user.last_name = auth.info.last_name
        user.password = Devise.friendly_token[0,20]
      end
    end

【问题讨论】:

    标签: ruby-on-rails carrierwave cloudinary


    【解决方案1】:

    在我的脑海中,我认为有两种方法可以解决这个问题:

    Carrierwave 提供了一个 remote_url,允许您从远程位置上传。在您的情况下,您将使用:

    user.remote_photo_url = auth.info.image # or something like that
    

    我能想到的另一种方法是使用open-uri提供的open方法(Rails默认需要)。

    你可以这样做:

    user.photo = open(auth.info.image)
    

    让我知道这些是否对你有用

    【讨论】:

    • 谢谢! remote_photo_url 是解决方案。
    【解决方案2】:

    Carrierwave 和 Cloudinary 集成允许您执行以下操作:

    cloudinary_hash = Cloudinary::Uploader.upload(auth.info.image)
    preloaded = Cloudinary::Utils.signed_preloaded_image(cloudinary_hash)
    user.photo = preloaded
    

    这将允许您稍后利用 Carrierwave 和 Cloudinary 来正确地利用 generating the different URLs。 您能看看这在您的特定流程中是否适合您吗?

    纳达夫。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多