Ich habe Picture-Modell, die Bilder von der ganzen App speichern, in einer speicherbaren Spalte Ich bewahre Image Owner-Objekt. Ich möchte eine Möglichkeit haben, diese Bilder mit unterschiedlicher Auflösung zu speichern.Schienen 4.2.6 + Polymorph + Carrierwave 0.10 + Bedingungen
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, class_name: Picture, as: :imageable, dependent: :destroy
accepts_nested_attributes_for :picture
end
In Carrierwave habe ich
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
gemacht, wie ich hier, um das Bild Inhabermodell holen kann?
model
Variable Referenzen auf Picture
Modell, ich habe alle vars mit pry
versucht, aber es ist nicht gelungen.
Natürlich kann ich Bild-Link direkt in Benutzer und Ereignis in diesem Snippet speichern, aber in Realworld Code habe ich etwa 15 verschiedene Modelle mit Bildern und ich muss eine Möglichkeit bieten, es in ActiveAdmin CMS zu bearbeiten (aber es ist eine andere Geschichte :)
UPDATE
Das Hauptproblem passiert, wenn ich neuen Datensatz erstellen. Also, ich habe versucht, inverse_of
hinzuzufügen, aber es hat nicht geholfen.
class Picture < AbstractModel
belongs_to :imageable, polymorphic: true, inverse_of: :pictures
mount_uploader :image, ImageUploader
class User < AbstractModel
has_one :picture, class_name: Picture, as: :imageable, dependent: :destroy, inverse_of: :imageable
accepts_nested_attributes_for :picture
ist hier Zustand model
in for_user?
Methode
[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, image: nil, imageable_id: nil, imageable_type: nil, created_at: nil, updated_at: nil>, @mounted_as=:image>, :xs=>#<ImageUploader::Uploader47012435752020:0x005583dee72450 @model=#<Picture id: nil, image: nil, imageable_id: nil, imageable_type: nil, created_at: nil, updated_at: nil>, @mounted_as=:image>, :avatar=>#<ImageUploader::Uploader47012437005860:0x005583dee72428 @model=#<Picture id: nil, image: nil, imageable_id: nil, imageable_type: nil, created_at: nil, updated_at: nil>, @mounted_as=:image>}>,
:imageable_id => nil,
:imageable_type => nil,
:created_at => nil,
:updated_at => nil
UPDATE2
Ich habe thried mit inverse_of: Bild und mit inverse_of: Bilder. Syntax-Fehler. Es läuft mit inverse_of:: bebilderbar, aber das Ergebnis ist das gleiche.
letzte Version von ImageUploader (ich es aus Gründen der Kürze geschnitten haben) ist
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
Ich habe einige Konsole bewegt gemacht, damit Sie sehen können, dass Modell verschachtelte Attribute akzeptiert . Im Falle der Beziehung funktioniert es auch ohne #inverse_of Methode (und dieser Moment ist schwierig für mich). Also, das Protokoll:
[43] pry(main)> ap v = VolunteerCenter.create(title: 'tst', address:'tst', city: City.first, phone:'123456',email: '[email protected]', 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", "tst"], ["city_id", 1], ["phone", "123456"], ["email", "[email protected]"], ["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", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["image", "image25749462_adfc024a9b54b718c1a755445661b099.jpg"], ["imageable_type", "VolunteerCenter"], ["imageable_id", 11], ["created_at", "2016-05-12 12:13:44.421458"], ["updated_at", "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, 12 May 2016 12:13:44 UTC +00:00,
:address => "tst",
:city_id => 1,
:phone => "123456",
:email => "[email protected]",
: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">, @mounted_as=:image, @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", @original_filename=nil, @content_type="image/jpeg">, @versions={:mini=>#<ImageUploader::Uploader46921211280280:0x00555966c55890 @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">, @mounted_as=:image, @parent_cache_id="1463055224-8966-4735", @cache_id=nil, @filename="image25749462_adfc024a9b54b718c1a755445661b099.jpg", @original_filename="image25749462_adfc024a9b54b718c1a755445661b099.jpg", @file=#<CarrierWave::SanitizedFile:0x00555966e89620 @file="/home/kvokka/proj/volunteers/public/uploads/picture/image/120/mini_image25749462_adfc024a9b54b718c1a755445661b099.jpg", @original_filename=nil, @content_type="image/jpeg">, @versions={}, @storage=#<CarrierWave::Storage::File:0x00555966e8a4a8 @uploader=#<ImageUploader::Uploader46921211280280:0x00555966c55890 ...>>>, :xs=>#<ImageUploader::Uploader46921211274220:0x00555966c55868 @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">, @mounted_as=:image, @parent_cache_id="1463055224-8966-4735", @cache_id=nil, @filename="image25749462_adfc024a9b54b718c1a755445661b099.jpg", @original_filename="image25749462_adfc024a9b54b718c1a755445661b099.jpg", @file=#<CarrierWave::SanitizedFile:0x005559659d60c0 @file="/home/kvokka/proj/volunteers/public/uploads/picture/image/120/xs_image25749462_adfc024a9b54b718c1a755445661b099.jpg", @original_filename=nil, @content_type="image/jpeg">, @versions={}, @storage=#<CarrierWave::Storage::File:0x005559659d7010 @uploader=#<ImageUploader::Uploader46921211274220:0x00555966c55868 ...>>>, :avatar==>#<ImageUploader::Uploader46921211257860:0x00555966c55840 @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">, @mounted_as=:image, @parent_cache_id="1463055224-8966-4735", @cache_id=nil, @filename="image25749462_adfc024a9b54b718c1a755445661b099.jpg", @original_filename="image25749462_adfc024a9b54b718c1a755445661b099.jpg", @file=#<CarrierWave::SanitizedFile:0x00555963379328 @file="/home/kvokka/proj/volunteers/public/uploads/picture/image/120/avatar=_image25749462_adfc024a9b54b718c1a755445661b099.jpg", @original_filename=nil, @content_type="image/jpeg">, @versions={}, @storage=#<CarrierWave::Storage::File:0x0055596337a390 @uploader=#<ImageUploader::Uploader46921211257860:0x00555966c55840 ...>>>}, @storage=#<CarrierWave::Storage::File:0x00555965d85fb8 @uploader=#<ImageUploader:0x0055596544d928 ...>>>,
:imageable_id => 11,
:imageable_type => "VolunteerCenter",
:created_at => Thu, 12 May 2016 12:13:44 UTC +00:00,
:updated_at => Thu, 12 May 2016 12:13:44 UTC +00:00
}
Update4
Diese happents, wenn ich mit hebeln in Callback-Methode ausgeführt werden.
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
Ich schalte alle Validierungen zur Klärung aus. Dieser Rückruf wird 3 mal aufgerufen, und in ersten 2 User
Instanz ist nicht bereit, und nach dem letzten der Rückruf nicht funktionieren.
[46] pry(main)> ap u = User.create(email: '[email protected]', 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, image: nil, imageable_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, image: nil, imageable_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", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id" [["image", "31f7627609164af8.png"], ["created_at", "2016-05-12 13:48:40.071387"], ["updated_at", "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" = '[email protected]' LIMIT 1
SQL (0.4ms) INSERT INTO "users" ("email", "encrypted_password", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["email", "[email protected]"], ["encrypted_password", "$2a$11$qq8tVgzISJguKz7oVJWyVO45vW/ujSEsi/ow29w78nC9ByOdjrPYK"], ["created_at", "2016-05-12 13:48:41.761836"], ["updated_at", "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"], ["imageable_id", 31], ["updated_at", "2016-05-12 13:48:41.764681"], ["id", 112]]
(2.7ms) COMMIT
, {
:id => 31,
:email => "[email protected]",
: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,
:created_at => Thu, 12 May 2016 13:48:41 UTC +00:00,
:updated_at => Thu, 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
Die Frage ist noch offen
Danke, aber es hat nicht geholfen. Ich habe die Frage aktualisiert und einige Details hinzugefügt, daher kann es nützlich sein. Ihre Idee wird nur für die Aktualisierung des Bildes verzweigen, und für neue werde ich alle Versionen erfassen. –
Ich habe meine Antwort aktualisiert. Können Sie versuchen, ob es funktioniert? –
Danke. Ich habe es gewagt: Bild und: Bilder. Syntax-Fehler. Es läuft mit inverse_of:: bebilderbar, aber das Ergebnis ist das gleiche. –