9
votes

Monkey patching ActiveStorage :: Attachment se perd

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


0 commentaires

3 Réponses :


2
votes

Semble avoir à voir avec delegate_missing_to , par exemple

def url
  @url
end

def url=(url)
  @url = url
end

https://github.com/rails/rails/blob/master/activestorage/app/models/active_storage/attachment.rb# L14

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.


1 commentaires

Ok, je n'ai pas défini le getter et le setter au lieu de attr_accessor . Nous verrons comment ça se passe. Merci



5
votes

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.


0 commentaires

2
votes

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


1 commentaires

Semble être la méthode que j'avais besoin de connaître. Merci