ruby-on-rails – Rails 4.2.6 Polymorphic Carrierwave 0.10条
我有图片模型,它存储整个应用程序中的图片,在可成像列我存储图像所有者对象.我希望能够以不同的分辨率保存这些图片.
class Picture < AbstractModel belongs_to :imageable,polymorphic: true mount_uploader :image,ImageUploader end class User < AbstractModel has_one :picture,class_name: Picture,as: :imageable,dependent: :destroy accepts_nested_attributes_for :picture end class Event < AbstractModel has_one :picture,dependent: :destroy accepts_nested_attributes_for :picture end 在Carrierwave我做过 class ImageUploader < CarrierWave::Uploader::Base version :xs if: :for_user? do process resize_to_fit: [100,100] end private def for_user?(_picture) # And here I hit the problem! # model.is_a? User end end 我如何在这里获取图片所有者模型? 在图片模型上模型变量引用,我已经用pry尝试了所有变量,但没有成功. 当然我可以直接在这个片段中的用户和事件中存储图像链接,但是,在realworld代码中,我有大约15个使用图像的不同模型,我必须提供在ActiveAdmin CMS中编辑它的能力(但它是另一个故事:) UPDATE 当我创建新记录时,主要问题就出现了.所以,我试图添加inverse_of,但它没有帮助. class Picture < AbstractModel belongs_to :imageable,polymorphic: true,inverse_of: :pictures mount_uploader :image,ImageUploader class User < AbstractModel has_one :picture,dependent: :destroy,inverse_of: :imageable accepts_nested_attributes_for :picture 这是for_user中的模型状态?方法 [5] pry(#<ImageUploader>)> ap model Изображение для { :id => nil,:image => #<ImageUploader:0x005583dee8f938 @model=#<Picture id: nil,image: nil,imageable_id: nil,imageable_type: nil,created_at: nil,updated_at: nil>,@mounted_as=:image,@cache_id="1463023347-21567-5096",@filename="rootp_HE_pause-20160113_141810.jpg",@original_filename="rootp_HE_pause-20160113_141810.jpg",@file=#<CarrierWave::SanitizedFile:0x005583dee8cf30 @file="/home/kvokka/proj/volunteers/public/uploads/tmp/1463023347-21567-5096/rootp_HE_pause-20160113_141810.jpg",@original_filename=nil,@content_type="image/jpeg">,@versions={:mini=>#<ImageUploader::Uploader47012442238420:0x005583dee724a0 @model=#<Picture id: nil,@mounted_as=:image>,:xs=>#<ImageUploader::Uploader47012435752020:0x005583dee72450 @model=#<Picture id: nil,:avatar=>#<ImageUploader::Uploader47012437005860:0x005583dee72428 @model=#<Picture id: nil,@mounted_as=:image>}>,:imageable_id => nil,:imageable_type => nil,:created_at => nil,:updated_at => nil UPDATE2 我用inverse_of :: picture和inverse_of :: pictures进行了争吵.语法错误.它使用inverse_of :: imageable运行,但结果是相同的. 最后一个版本的ImageUploader(我为了简洁而剪了它) class ImageUploader < CarrierWave::Uploader::Base version :xs do process resize_to_fit: [100,100] end version :avatar,if: :for_user? do process resize_to_fit: [360,360] end private def for_user?(_) model.imageable.is_a? User end end UPDATE3 我做了一些控制台移动,所以你可以看到,该模型接受嵌套属性.在has_one关系的情况下,它也可以在没有#inverse_of方法的情况下工作(这一刻对我来说很棘手).所以,日志: [43] pry(main)> ap v = VolunteerCenter.create(title: 'tst',address:'tst',city: City.first,phone:'123456',email: 'mm@mm.ru',description: 'ololo',link: 'http://ddd.ru',picture: (Picture.new( remote_image_url: 'https://retina.news.mail.ru/prev780x440/pic/e5/35/image25749462_adfc024a9b54b718c1a755445661b099.jpg'))) City Load (0.8ms) SELECT "cities".* FROM "cities" ORDER BY "cities"."id" ASC LIMIT 1 (0.2ms) BEGIN SQL (0.4ms) INSERT INTO "volunteer_centers" ("title","address","city_id","phone","email","description","link","created_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9) RETURNING "id" [["title","tst"],["address",["city_id",1],["phone","123456"],["email","mm@mm.ru"],["description","ololo"],["link","http://ddd.ru"],["created_at","2016-05-12 12:13:44.417945"],["updated_at","2016-05-12 12:13:44.417945"]] SQL (0.3ms) INSERT INTO "pictures" ("image","imageable_type","imageable_id",$5) RETURNING "id" [["image","image25749462_adfc024a9b54b718c1a755445661b099.jpg"],["imageable_type","VolunteerCenter"],["imageable_id",11],"2016-05-12 12:13:44.421458"],"2016-05-12 12:13:44.421458"]] (2.2ms) COMMIT tst { :id => 11,:title => "tst",:created_at => Thu,12 May 2016 12:13:44 UTC +00:00,:updated_at => Thu,:address => "tst",:city_id => 1,:phone => "123456",:email => "mm@mm.ru",:description => "ololo",:vk_link => nil,:link => "http://ddd.ru" } => nil [44] pry(main)> ap v.picture VolunteerCenter Load (0.6ms) SELECT "volunteer_centers".* FROM "volunteer_centers" WHERE "volunteer_centers"."id" = $1 LIMIT 1 [["id",11]] Изображение для tst { :id => 120,:image => #<ImageUploader:0x0055596544d928 @model=#<Picture id: 120,image: "image25749462_adfc024a9b54b718c1a755445661b099.jpg",imageable_id: 11,imageable_type: "VolunteerCenter",created_at: "2016-05-12 12:13:44",updated_at: "2016-05-12 12:13:44">,@cache_id=nil,@filename="image25749462_adfc024a9b54b718c1a755445661b099.jpg",@original_filename="image25749462_adfc024a9b54b718c1a755445661b099.jpg",@file=#<CarrierWave::SanitizedFile:0x00555963f0c690 @file="/home/kvokka/proj/volunteers/public/uploads/picture/image/120/image25749462_adfc024a9b54b718c1a755445661b099.jpg",@versions={:mini=>#<ImageUploader::Uploader46921211280280:0x00555966c55890 @model=#<Picture id: 120,@parent_cache_id="1463055224-8966-4735",@file=#<CarrierWave::SanitizedFile:0x00555966e89620 @file="/home/kvokka/proj/volunteers/public/uploads/picture/image/120/mini_image25749462_adfc024a9b54b718c1a755445661b099.jpg",@versions={},@storage=#<CarrierWave::Storage::File:0x00555966e8a4a8 @uploader=#<ImageUploader::Uploader46921211280280:0x00555966c55890 ...>>>,:xs=>#<ImageUploader::Uploader46921211274220:0x00555966c55868 @model=#<Picture id: 120,@file=#<CarrierWave::SanitizedFile:0x005559659d60c0 @file="/home/kvokka/proj/volunteers/public/uploads/picture/image/120/xs_image25749462_adfc024a9b54b718c1a755445661b099.jpg",@storage=#<CarrierWave::Storage::File:0x005559659d7010 @uploader=#<ImageUploader::Uploader46921211274220:0x00555966c55868 ...>>>,:avatar==>#<ImageUploader::Uploader46921211257860:0x00555966c55840 @model=#<Picture id: 120,@file=#<CarrierWave::SanitizedFile:0x00555963379328 @file="/home/kvokka/proj/volunteers/public/uploads/picture/image/120/avatar=_image25749462_adfc024a9b54b718c1a755445661b099.jpg",@storage=#<CarrierWave::Storage::File:0x0055596337a390 @uploader=#<ImageUploader::Uploader46921211257860:0x00555966c55840 ...>>>},@storage=#<CarrierWave::Storage::File:0x00555965d85fb8 @uploader=#<ImageUploader:0x0055596544d928 ...>>>,:imageable_id => 11,:imageable_type => "VolunteerCenter",12 May 2016 12:13:44 UTC +00:00 } UPDATE4 当我在回调方法中使用pry运行时会发生这种情况. class ImageUploader < CarrierWave::Uploader::Base version :avatar,if: :for_user? do puts 'This line never run' process resize_to_fit: [360,360] end private def for_user?(picture) binding.pry model.imageable.is_a? User end 我关闭所有验证以澄清. [46] pry(main)> ap u = User.create(email: 'example@test.com',password: '123456',password_confirmation: '123456',picture: (Picture.create remote_image_url: 'http://onrails.club/uploads/default/29/31f7627609164af8.png')) From: /home/kvokka/proj/volunteers/app/uploaders/image_uploader.rb @ line 68 ImageUploader#for_user?: 66: def for_user?(_) 67: binding.pry => 68: model.imageable.is_a? User 69: end @cache_id "1463060913-8966-3349" @file #<CarrierWave::SanitizedFile:0x00555963268330 @file="/hom... @filename "31f7627609164af8.png" @model #<Picture id: nil,imageab... @mounted_as :image @original_filename "31f7627609164af8.png" @versions {:mini=>#<ImageUploader::Uploader46921199022860:0x0055596... [1] pry(#<ImageUploader>)> From: /home/kvokka/proj/volunteers/app/uploaders/image_uploader.rb @ line 68 ImageUploader#for_user?: 66: def for_user?(_) 67: binding.pry => 68: model.imageable.is_a? User 69: end @cache_id "1463060913-8966-3349" @file #<CarrierWave::SanitizedFile:0x00555963268330 @file="/hom... @filename "31f7627609164af8.png" @model #<Picture id: nil,imageab... @mounted_as :image @original_filename "31f7627609164af8.png" @versions {:mini=>#<ImageUploader::Uploader46921199022860:0x0055596... [1] pry(#<ImageUploader>)> (0.3ms) BEGIN SQL (0.7ms) INSERT INTO "pictures" ("image",$3) RETURNING "id" [["image","31f7627609164af8.png"],"2016-05-12 13:48:40.071387"],"2016-05-12 13:48:40.071387"]] From: /home/kvokka/proj/volunteers/app/uploaders/image_uploader.rb @ line 68 ImageUploader#for_user?: 66: def for_user?(_) 67: binding.pry => 68: model.imageable.is_a? User 69: end @cache_id nil @file #<CarrierWave::SanitizedFile:0x005559639c6348 @file="/hom... @filename "31f7627609164af8.png" @model #<Picture id: 112,image: "31f7627609164af8.png",imageab... @mounted_as :image @original_filename "31f7627609164af8.png" @storage #<CarrierWave::Storage::File:0x00555963b5add0 @uploader=#... @versions {:mini=>#<ImageUploader::Uploader46921199022860:0x0055596... [1] pry(#<ImageUploader>)> (2.9ms) COMMIT (0.2ms) BEGIN User Exists (0.7ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = 'example@test.com' LIMIT 1 SQL (0.4ms) INSERT INTO "users" ("email","encrypted_password",$4) RETURNING "id" [["email","example@test.com"],["encrypted_password","$2a$11$qq8tVgzISJguKz7oVJWyVO45vW/ujSEsi/ow29w78nC9ByOdjrPYK"],"2016-05-12 13:48:41.761836"],"2016-05-12 13:48:41.761836"]] SQL (0.4ms) UPDATE "pictures" SET "imageable_type" = $1,"imageable_id" = $2,"updated_at" = $3 WHERE "pictures"."id" = $4 [["imageable_type","User"],31],"2016-05-12 13:48:41.764681"],["id",112]] (2.7ms) COMMIT,{ :id => 31,:email => "example@test.com",:encrypted_password => "$2a$11$qq8tVgzISJguKz7oVJWyVO45vW/ujSEsi/ow29w78nC9ByOdjrPYK",:reset_password_token => nil,:reset_password_sent_at => nil,:remember_created_at => nil,:sign_in_count => 0,:current_sign_in_at => nil,:last_sign_in_at => nil,:current_sign_in_ip => nil,:last_sign_in_ip => nil,12 May 2016 13:48:41 UTC +00:00,:name => nil,:surname => nil,:phone => nil,:dob => nil,:gender => nil,:height => nil,:about => nil,:information_source_id => nil,:institution_id => nil,:clothes_size_id => nil,:city_id => nil,:volunteer_center_id => nil,:blood_id => nil,:vkontakte_link => nil,:medical_contraindications => nil } => nil 问题仍然存在 解决方法
当您说“图片所有者模型”时,假设您指的是用户记录,那么您可以执行以下操作 class ImageUploader < CarrierWave::Uploader::Base ... def for_user?(picture) user = model.imageable user.is_a? User # => true end ... end 从docs开始: > picture参数是要上传的文件对象(这不是Picture模型的实例) 既然你知道模型是Picture的一个实例,那个Picture belongs_to:imageable,那个:imageable是一个多态关联,实际上是你的案例中的用户记录,那么你可以用上面的答案访问相关的记录.但请注意,它可能并不总是用户记录,因为它是多态关联. UPDATE 我猜测model.imageable无效,因为从嵌套参数设置后可成像记录为零. 你能试一下吗 class Picture < AbstractModel belongs_to :imageable,inverse_of: :picture # WITHOUT s UPDATE 看起来像inverse_of不适用于多态关联(here和here)
附:这可能很棘手.如果我有时间,我会尝试重现问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |