1 votes

before_filter ne fonctionne pas dans state_machine :(

J'ai un modèle qui s'appuie sur state_machine pour gérer ses différents états. Un événement particulier nécessite un before_transition car il doit construire une table de jonction avant d'effectuer la transition. Malheureusement, cela ne fonctionne pas.

class DocumentSet < ActiveRecord::Base

  state_machine :state, :initial => :draft do
    # Callbacks
    before_transition :on=>:submit, :do=>:populate_join_table

    # States
    state :draft
    state :submitted

    # Events
    event :submit do transition :draft=>:submitted, :if=>:can_submit? end
  end

def populate_join_table
   puts '::::::::: INSIDE POPULATE_JOIN_TABLE'
end

def can_submit?    
  raise "Document Set has no Document(s)" if self.document_versions.blank?
  true
end

Maintenant, quand je fais DocumentSet.submit, il n'entre jamais dans la table populate_join_table car il évalue le can_submit ? comme faux.

Qu'est-ce que je rate ?

3voto

khelal Points 81

Je pense avoir trouvé la solution. En gros, ce qui se passe, c'est que state_machine évalue d'abord la condition :if, et seulement ensuite fait la transition before_transition.

Donc l'ordre est :

If (GuardCondition == true)
  run before_transition
  run transition
  run before_transition

1voto

dunedain289 Points 1538

La ou les conditions de garde contrôlent si cet événement (et la transition) est valide ou non à ce moment-là. Dans ce cas, votre garde renvoie false, donc vous ne ferez pas de transition. Cela peut s'avérer extrêmement utile, mais dans votre cas, vous devrez peut-être retravailler/réfléchir à certaines choses pour permettre l'exécution de ce callback.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X