Toujours en train de batailler avec attachment_fu…
Suite au bug d’hier, j’ai tenté une autre approche plus proche de ce que
fait attachment_fu :
def recrop_image(img, top, left, size)
size = size.first if size.is_a?(Array) && size.length == 1
size = [size.to_i, size.to_i] if ! size.is_a?(Array)
img.crop(top, left, size[0], size[1])
self.temp_path = write_to_temp_file(img.to_blob { self.quality = 75
})
end
def recrop_image_or_thumbnail!(img, top, left)
if (!respond_to?(:parent_id) || parent_id.nil?) &&
attachment_options[:resize_to] # parent image
resize_image(img, top, left, attachment_options[:resize_to])
elsif thumbnail_resize_options # thumbnail
resize_image(img, top, left, thumbnail_resize_options)
end
end
De nouveau rien de transcendental, je reprend dans l’idée le code des
fonctions resize_image et resize_image_or_thumbnail! (qui semble la
seule Ã
appeller resize_image dans le code de attachment_fu). J’ajoute donc
toujours
deux paramètres top et left toujours pour permettre de définir le bord
haut
et gauche du recadrement de l’image, et j’effectue un recadrement à la
place
du redimensionnement.
Là se posent deux problèmes :
1- attachment_fu appelle resize_image_or_thumbnail! uniquement dans la
méthode process_attachment_with_processing des modules “processor”, et
je
n’arrive pas à trouver où est appellé
process_attachment_with_processing,
elle n’apparaît nulle part dans le code de attachment_fu. Apparement
elle ne
fait pas plus partie de ActiveRecord::Base, du coup je suis dans le noir
complet.
2- j’ai essayé de déclencher “à la main” ma méthode
recrop_image_or_thumbnail!, puis de sauver la vignette, et ça ne mène
qu’Ã
une erreur :
image = Image.find(:first, :conditions => {:thumbnail => nil}, :order =>
‘id desc’)
=> …
thumb = image.thumbnails.find(:first, :conditions => {:thumbnail =>
‘thumb’})
=> …
thumb.recrop_image_or_thumbnail!(Magick::Image.from_blob(
image.db_file.data).first, 0, 0)
=> nil
thumb.save!
NameError: undefined local variable or method full_filename' for #<Image:0xb71636c4> from ./script/../config/../config/../vendor/rails/activerecord/lib/active_record/base.rb:1860:in
method_missing’
from
./script/…/config/…/config/…/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu.rb:276:in
temp_paths' from ./script/../config/../config/../vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu.rb:270:in
temp_path’
from
./script/…/config/…/config/…/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu.rb:236:in
save_attachment?' from ./script/../config/../config/../vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu.rb:339:in
set_size_from_temp_path’
from
./script/…/config/…/config/…/vendor/rails/activerecord/lib/active_record/callbacks.rb:333:in
send' from ./script/../config/../config/../vendor/rails/activerecord/lib/active_record/callbacks.rb:333:in
callback’
from
./script/…/config/…/config/…/vendor/rails/activerecord/lib/active_record/callbacks.rb:330:in
each' from ./script/../config/../config/../vendor/rails/activerecord/lib/active_record/callbacks.rb:330:in
callback’
from
./script/…/config/…/config/…/vendor/rails/activerecord/lib/active_record/callbacks.rb:295:in
valid?' from ./script/../config/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:761:in
save_without_transactions!’
from
./script/…/config/…/config/…/vendor/rails/activerecord/lib/active_record/transactions.rb:133:in
save!' from ./script/../config/../config/../vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:59:in
transaction’
from
./script/…/config/…/config/…/vendor/rails/activerecord/lib/active_record/transactions.rb:95:in
transaction' from ./script/../config/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:121:in
transaction’
from
./script/…/config/…/config/…/vendor/rails/activerecord/lib/active_record/transactions.rb:133:in
`save!’
from (irb):4
Bref, je crois que je loupe un truc vital d’attachment_fu sans réussir Ã
mettre le doigt dessus. Je me demande si ça ne vient pas du fait
qu’attachment_fu travaille normalement à partir d’une image stockée dans
le
système de fichier, fait les recadrage en pilote automatique une bonne
fois
pour toute et basta, l’image est stockée et c’est censé être stockée une
fois pour toute on nettoie et on y touche plus. En gros, ce que j’essaye
de
faire en copiant l’existant ne pourrait marcher qu’en remplacement de
l’existant, ce que je ne souhaite pas pour toutes ces raisons :
- je veux garder attachment_fu aussi fonctionnel qu’au premier jour
- le comportement par défaut (redimensionner + découper) me va très bien
- mon action nécessite deux paramètres supplémentaires qui vont varier
pour
chaque image, les stocker dans la définition du modèle ne serait pas une
bonne idée
- la nouvelle action est censée se produire après l’enregistrement de
l’image lorsque l’utilisateur souhaitera remplacer la vignette
redimensionnée + recadrée par une vignette simplement recadrée à un
endroit
stratégique de l’image ; autant avoir entre temps de vignettes
fonctionnelles enregistrées
Voilà , sur la fin c’était moins une question qu’une réflexion écrite,
mais
bon si ça inspire quelqu’un, je suis à cours d’idées pour ce matin de
toute
façon.
Merci encore d’avoir tenu jusqu’Ã la fin de ce long mail.