Carrierwave บล็อกการเปลี่ยนแปลงแอตทริบิวต์หรือไม่

ฉันค้นพบปัญหานี้เมื่อใช้งาน omniauth-facebook ในแอปพลิเคชันของฉัน ฉันสามารถใช้กราฟแฮชของ Facebook เพื่ออัปเดตชื่อผู้ใช้และอีเมลของพวกเขาได้ แต่ไม่ใช่แอตทริบิวต์รูปภาพ

เมื่อฉันพยายามเปลี่ยนแอตทริบิวต์รูปภาพ (สตริง) ของผู้ใช้ ระบบจะอัปเดตค่าเป็นศูนย์เสมอ:

@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 เป็นสาเหตุเพราะฉันสามารถอัปเดตแอตทริบิวต์อื่นๆ ด้วยตนเองได้โดยไม่มีปัญหา ฉันจะลบล้างพฤติกรรมนี้ได้อย่างไร

ด้านล่างนี้คือสิ่งที่ฉันใช้เพื่อตั้งค่า user.photo ตามแฮชการโทรกลับจาก Facebook (ที่ฉันค้นพบปัญหา) แฮชแบบ 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

person Erik V    schedule 12.07.2016    source แหล่งที่มา


คำตอบ (2)


เหนือหัวของฉัน ฉันคิดว่ามีสองวิธีในการแก้ไขปัญหานี้:

Carrierwave จัดเตรียม URL ระยะไกลที่ช่วยให้คุณสามารถอัปโหลดจากสถานที่ห่างไกลได้ ในกรณีของคุณ คุณจะใช้:

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

อีกวิธีหนึ่งที่ฉันคิดได้คือใช้วิธี open ที่ได้รับจาก open-uri (จำเป็นโดยค่าเริ่มต้นใน Rails)

คุณสามารถทำได้:

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

แจ้งให้เราทราบหากสิ่งเหล่านี้ใช้ได้ผลสำหรับคุณ

person oreoluwa    schedule 12.07.2016
comment
ขอบคุณ! remote_photo_url เป็นวิธีแก้ปัญหา - person Erik V; 13.07.2016

การผสานรวม Carrierwave และ Cloudinary ช่วยให้คุณทำสิ่งต่อไปนี้:

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

การดำเนินการนี้จะช่วยให้คุณใช้ประโยชน์จาก Carrierwave & Cloudinary ได้ในภายหลังเพื่อสร้าง URL ที่แตกต่างกัน อย่างเหมาะสม คุณเห็นไหมว่าสิ่งนี้ใช้ได้ผลสำหรับคุณในโฟลว์เฉพาะของคุณหรือไม่?

นาดาฟ.

person Nadav Ofir    schedule 18.07.2016