Изменение атрибута блоков 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 (где я обнаружил проблему). Облачный хеш отлично возвращает URL-адрес в виде строки; это не проблема с auth.info.image или облачным ответом на загрузку.

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-адрес remote_, который позволяет загружать из удаленного места. В вашем случае вы будете использовать:

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