J'ai donc décidé d'ajouter une url
attr_accessor aux objets ActiveStorage :: Attachment.
En développement , le correctif tient pendant un certain temps jusqu'à ce qu'il semble "avoir été perdu". Cela signifie que cela fonctionne pendant quelques minutes, puis cela ne fonctionne plus. Ensuite, je dois redémarrer le serveur pour que le correctif soit à nouveau appliqué. Je pense que je ne corrige pas correctement et j'aurais besoin de conseils à ce sujet.
Voici ce que j'ai essayé:
lib / ext / active_storage / attachment. rb
Premier essai:
Module::DelegationError in Products#images url delegated to blob, but blob is nil
Deuxième essai
require 'ext/active_storage/attachment'
Et au fait, dans les deux cas, il est chargé avec ceci:
config / initializers / monkey_patches.rb
class ActiveStorage::Attachment < ActiveRecord::Base attr_accessor :url end
Donc quand ça marche, je n'ai pas de message d'erreur, mais après un certain temps le patch "disparaît" (manque de meilleurs termes), et j'obtiens l'erreur suivante, me disant que mon attr_accessor n'est plus là. Les rails doivent avoir rechargé les classes ActiveStorage et mon correctif est perdu.
module ActiveStorageUrl extend ActiveSupport::Concern included do attr_accessor :url end end ActiveStorage::Attachment.send :include, ActiveStorageUrl
3 Réponses :
Semble avoir à voir avec delegate_missing_to
, par exemple
def url @url end def url=(url) @url = url end
Accéder à où il est défini :
Quoi qu'il en soit, cela pourrait avoir à voir avec le fonctionnement de attr_accessor
, j'essaierais:
XXX
Au lieu de attr_accessor
(qui est en fait une fonction C).
Sinon, une façon vraiment vraiment pirate de résoudre ce problème serait de vérifier ActiveStorage :: Attachment.instance_methods.include? (: url)
et monkey patch / include / prepend lorsqu'il n'est pas présent.
Ok, je n'ai pas défini le getter et le setter au lieu de attr_accessor
. Nous verrons comment ça se passe. Merci
J'ai placé mon ActiveStorage :: Attachment
MonkeyPatch dans / app / models / active_storage /
J'ai ajouté un rappel pour être informé si la pièce jointe a changé. Cela fonctionne bien, tout le temps.
C'est peut-être le problème.
Vous perdez probablement votre patch monkey car le code est rechargé et votre ext / active_storage / attachment n'est plus requis.
Vous pouvez dire à Rails d'exécuter un rappel au démarrage et chaque fois que le code est rechargé comme ceci.
Rails.configuration.to_prepare do require 'ext/active_storage/attachment' end
Semble être la méthode que j'avais besoin de connaître. Merci