2016-07-12 4 views
0

Я обнаружил эту проблему при реализации omniauth-facebook в своем приложении. Я мог бы использовать хэш хэндлайна facebook для обновления имени моего пользователя и его электронной почты, но не атрибута фотографии.Изменение атрибутов блоков Carrierwave?

Когда я пытаюсь изменить атрибут фото (строка) пользователя, он всегда обновляет значение всухую:

@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 

У меня есть photouploader установлен на моей модели/User.rb:

mount_uploader :photo, PhotoUploader 

и реализованы (закачивающие/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 

ответ

1

Над верхней части моей головы, я думаю, что есть два способа обойти это:

Carrierwave обеспечивает remote_ URL, который позволяет загружать из удаленного местоположения. В вашем случае, вы будете использовать:

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

Другой способ, которым я мог думать о том, чтобы использовать open метод, предоставленный открытым URI (требуется по умолчанию в Rails).

Вы можете сделать:

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

Позвольте мне знать, если любой из них работали для вас

+0

Спасибо! Решение remote_photo_url было решением. –

0

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. Вы видите, что это работает для вас в вашем конкретном потоке?

Nadav.

Смежные вопросы