Je n'arrive pas à obtenir le Voici mon modèle: P> state_machine code> gem ( http: // github .com / pluginaweek / stadif_machine / ) Pour travailler sur des enregistrements existants (cela fonctionne correctement sur les nouveaux enregistrements).
>> 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"
7 Réponses :
Pouvez-vous réessayer vos transitions d'état avec Publish **! ** Au lieu de publier P>
Publier code> et
Publier! code> avoir le même effet dans les exemples ci-dessus (ARGH!)
Encore une fois, pas une vraie réponse à votre question, mais ici, j'ai essayé de simuler votre session: 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.) P> p>
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! P>
Quoi qu'il en soit, vous n'êtes pas seul, il a toujours besoin d'une solution. P>
Cela se produit-il toujours avec des mises à jour partielles éteintes? Si tel est le cas, nous savons que le problème est d'identifier des objets sales. Vous devriez pouvoir appeler Commentaire.Partial_updates = False code> p>
c.state_will_changer! Code> avant d'appeler
c.publish code> p> p>
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 code>, mais pas quand je fais
c.state_will_changer! Code> (voir
Après c.state_will_changer! Code> exécuter
c.changed code> Le tableau renvoyé a-t-il
"State" code>
Est-ce que update_attribute ("état", "publié") code> travaille toujours? Vous voudrez peut-être simplement écraser
Publier! Code> pour faire appel à la mise à jour manuellement ...
update_attribute ("État", "Publié") code> fonctionne, mais si je préfère ne pas casser
state_machine code> 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?
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
Essayez de supprimer: l'état de la définition: p>
de: État_machine: Etat,: Initial =>: En attente do p>
à state_machine: initiale =>: en attente do p>
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. P>
Vous devez avoir une colonne appelée «état» dans votre table, donc State_Machine pourra rendre l'état persistant. P>
Il suffit de l'ajouter à votre migration - t.string: état p>
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 CODE> é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 A>) 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 code> au lieu de
: de =>: de_state,: to =>: to_state code>
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é