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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top