custom method_missing ignoré si l'instance est définie via une association ActiveRecord
-
29-10-2019 - |
Question
J'ai des soumissions qui peuvent être dans différents états et j'ai écrit un remplacement method_missing qui me permet de vérifier leur état avec des appels comme
submission.draft?
submission.published?
Cela fonctionne à merveille.
Moi aussi, pour diverses raisons qui ne sont peut-être pas si géniales, j'ai un modèle appelé Packlet
qui appartient_à une réunion et appartient_à une soumission.Cependant, j'ai été surpris de constater que
packlet.submission.draft?
renvoie un NoMethodError
.D'un autre côté, si je code en dur une méthode #draft?
dans Submission
, l'appel de méthode ci-dessus fonctionne.
Comment faire reconnaître mes méthodes method_missing même lorsque l'instance est définie via une association ActiveRecord?
La solution
Avez-vous ajouté le brouillon?méthode à votre respond_to?méthode pour cet objet?Je suppose que le problème pourrait se poser là-bas.Que se passe-t-il lorsque vous tapez:
submission.respond_to?(:draft?)
Pour résoudre ce problème, écrivez en fait un respond_to?méthode comme celle-ci:
def respond_to?(method, include_priv = false) #:nodoc: case method.to_sym when :draft?, :published? true else super(method, include_priv) end end
Ma recommandation serait de l'implémenter sans utiliser method_missing à la place, donc en faisant une méta-programmation comme celle-ci:
class Submission [:draft, :published].each do |status| define_method "#{status}?" do status == "#{status}?" end end end