7
votes

state_machine ne fonctionne que pour les nouveaux enregistrements

Je n'arrive pas à obtenir le state_machine code> gem ( http: // github .com / pluginaweek / stadif_machine / ) Pour travailler sur des enregistrements existants (cela fonctionne correctement sur les nouveaux enregistrements).

Voici mon modèle: P>

>> a = Comment.last
  Comment Load (0.3ms)   SELECT * FROM "comments" ORDER BY comments.id DESC LIMIT 1
=> #<Comment id: 5, song_id: nil, author: nil, body: nil, created_at: "2009-11-02 06:33:19", updated_at: "2009-11-02 06:33:19", state: "pending">
>> a.state = "published"
=> "published"
>> a.save
  Comment Update (0.6ms)   UPDATE "comments" SET "state" = 'published', "updated_at" = '2009-11-02 08:29:34' WHERE "id" = 5
=> true
>> a.id
=> 5
>> Comment.find(5).state
  Comment Load (0.4ms)   SELECT * FROM "comments" WHERE ("comments"."id" = 5) 
=> "published"


8 commentaires

Sérieusement, cela me rend fou (même mon chapeau de programmation spécial ( img4.imageshack.us/ IMG4 / 9105 / photo2gw.jpg ) a été inutile)


: D +1 pour le chapeau!. Quoi qu'il en soit, toute raison pour laquelle vous n'utilisez pas la machine d'État Rails intégrée maintenant? blog.envylabs.com/2009/08/The-Rails-state -Machine


Est-ce que c'est dehors? ( Inclure Activerecord :: STATemachine échoue sur les rails 2.3.4 pour moi)


Oh! Vous avez raison! Vraiment désolé de vous déranger. Pour être honnête, je n'ai aucune expérience avec ce plugin particulier, mais AASM ( Github.com/Rubyist/Aasm) n'a jamais échoué pour moi. Alors peut-être essayer celui-là. Je sais, plus d'une solution de contournement qu'une solution, mais de toute façon, bonne chance.


Si je ne peux pas comprendre cela, je vais essayer de l'aasme, mais j'ai trouvé State_Machine d'être plus élégant: vous n'avez pas à déclarer explicitement vos États, et lorsque vous écrivez des transitions, vous pouvez faire : de_state =>: to_state au lieu de : de =>: de_state,: to =>: to_state


Pouvez-vous nous en dire plus sur votre environnement? Je viens d'essayer votre exemple avec Mac OS X 10.6.1 / Ruby 1.8.7 / Rails 2.3.4 / State_Machine 0.8.0 / SQLite3 et cela a fonctionné bien.


Mac OS X 10.5.8, Ruby 1.8.6, Rails 2.3.4, State_Machine 0.8.0, SQLite3


Avez-vous essayé de changer votre transition vers autre que tout? Essayez de définir explicitement votre transition, par exemple. : En attente =>: publié


7 Réponses :


1
votes

Pouvez-vous réessayer vos transitions d'état avec Publish **! ** Au lieu de publier


1 commentaires

Publier et Publier! avoir le même effet dans les exemples ci-dessus (ARGH!)



0
votes

Encore une fois, pas une vraie réponse à votre question, mais ici, j'ai essayé de simuler votre session: xxx

Comme vous pouvez le constater, cela fonctionne comme prévu pour moi. Vérifié deux fois. (J'ai créé un modèle avec des attributs corporels et d'état et placez votre code.)


0 commentaires

1
votes

Ne pas contribuer quoi que ce soit utile, mais je voulais juste dire que je me débats avec cette erreur aussi, dans plusieurs stations_machines tout au long de mon application. Et je ne peux pas changer d'aasme, car j'ai besoin d'avoir plus d'une state_machine dans le même modèle ... si frustrant!

Quoi qu'il en soit, vous n'êtes pas seul, il a toujours besoin d'une solution.


0 commentaires

1
votes

Cela se produit-il toujours avec des mises à jour partielles éteintes? Commentaire.Partial_updates = False

Si tel est le cas, nous savons que le problème est d'identifier des objets sales. Vous devriez pouvoir appeler c.state_will_changer! avant d'appeler c.publish


6 commentaires

C'est ce que je pensais, c'est le culprit probable depuis votre mise à jour n'envoie pas cette colonne.


Nous parlons maintenant! Il fonctionne lorsque je fais commentaire.partial_updates = false , mais pas quand je fais c.state_will_changer! (voir pastie.org/687584 pour ce que j'ai fait). Malheureusement, ce modèle contient de gros champs de texte et que je préférerais donc ne pas désactiver les mises à jour partielles en tant que solution de contournement (bien que j'étais implémenter State_Will_Changer! En contournement si cela fonctionnait)


Après c.state_will_changer! exécuter c.changed Le tableau renvoyé a-t-il "State"


Est-ce que update_attribute ("état", "publié") travaille toujours? Vous voudrez peut-être simplement écraser Publier! pour faire appel à la mise à jour manuellement ...


update_attribute ("État", "Publié") fonctionne, mais si je préfère ne pas casser state_machine abstraction de State_Machine comme ça ...


De Pastie.org/689749 Cela ressemble vraiment à des mises à jour sales sont cassées. Les mises à jour sales fonctionnent-elles avec tout autre modèle Activerecord qui n'utilise pas la machine à états? Utilisez-vous d'autres plugins / gemmes qui pourront essayer de dupliquer le comportement sale?



1
votes

Le modèle appelle-t-il super quand il est initialisé?

La documentation State_Machine dit qu'il est nécessaire pour les États d'être initialisé P>

def initialize
  @seatbelt_on = false
  super() # NOTE: This *must* be called, otherwise states won't get initialized
end


0 commentaires

0
votes

Essayez de supprimer: l'état de la définition:

de: État_machine: Etat,: Initial =>: En attente do

à state_machine: initiale =>: en attente do


0 commentaires

2
votes

Je suis venu sur le même problème 3 ans après que cela soit utile de répondre ici pour enregistrer l'heure d'autres personnes.

Vous devez avoir une colonne appelée «état» dans votre table, donc State_Machine pourra rendre l'état persistant.

Il suffit de l'ajouter à votre migration - t.string: état


0 commentaires