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.

--~--~---------~--~----~------------~-------~--~----~
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de 
Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse 
[email protected]
Pour résilier votre abonnement envoyez un e-mail à l'adresse [EMAIL PROTECTED]
-~----------~----~----~----~------~----~------~--~---

Répondre à