Carrierwave blocks属性变化?
Carrierwave blocks attribute change?
我在我的应用程序中实现 omniauth-facebook 时发现了这个问题。我可以使用 facebook 图表哈希来更新我的用户名和他们的电子邮件,但不能更新照片属性。
当我尝试更改用户的照片(字符串)属性时,它总是将值更新为 nil:
@user.update_attributes!(photo: "blah")
(0.5ms) BEGIN
SQL (0.7ms) UPDATE "users" SET "photo" = , "updated_at" = WHERE "users"."id" = [["photo", nil], ["updated_at", "2016-07-12 20:43:30.322405"], ["id", 31]]
(3.0ms) COMMIT
=> true
我的 models/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 hash returns a 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
在我的脑海中,我认为有两种方法可以解决这个问题:
Carrierwave 提供 remote_ url 允许您从远程位置上传。在您的情况下,您将使用:
user.remote_photo_url = auth.info.image # or something like that
我能想到的另一种方法是使用open-uri提供的open
方法(Rails中默认需要)。
你可以这样做:
user.photo = open(auth.info.image)
让我知道这些是否对您有用
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。
您能看看这是否适用于您的特定流程吗?
纳达夫
我在我的应用程序中实现 omniauth-facebook 时发现了这个问题。我可以使用 facebook 图表哈希来更新我的用户名和他们的电子邮件,但不能更新照片属性。
当我尝试更改用户的照片(字符串)属性时,它总是将值更新为 nil:
@user.update_attributes!(photo: "blah")
(0.5ms) BEGIN
SQL (0.7ms) UPDATE "users" SET "photo" = , "updated_at" = WHERE "users"."id" = [["photo", nil], ["updated_at", "2016-07-12 20:43:30.322405"], ["id", 31]]
(3.0ms) COMMIT
=> true
我的 models/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 hash returns a 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
在我的脑海中,我认为有两种方法可以解决这个问题:
Carrierwave 提供 remote_ url 允许您从远程位置上传。在您的情况下,您将使用:
user.remote_photo_url = auth.info.image # or something like that
我能想到的另一种方法是使用open-uri提供的open
方法(Rails中默认需要)。
你可以这样做:
user.photo = open(auth.info.image)
让我知道这些是否对您有用
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。 您能看看这是否适用于您的特定流程吗?
纳达夫