State Machines, jak zmienić stan na awaiting_review po akcji update

Cześć,

Chciałbym aby zawsze po zmianie obiektu jego stan zmieniał się na awaiting_review. I było to niezależne od statnu jaki w danym momencie posiada.

[code=ruby]class Cv < ActiveRecord::Base
include Workflow
workflow do
state :new do
event :submit, :transitions_to => :awaiting_review
end
state :awaiting_review do
event :review, :transitions_to => :being_reviewed
end
state :being_reviewed do
event :accept, :transitions_to => :accepted
event :reject, :transitions_to => :rejected
end
state :accepted
state :rejected
end

def submit
halt unless valid?
end
end

cvs_controller.rb

def update
@cv = Cv.find(params[:id])
if @cv.update_attributes(params[:cv])
# @cv.back_to_review!
redirect_to root_path
end
end[/code]

[code=ruby]before_save :needs_review, on: :update

def needs_review
self.state = ‘awaiting_review’
end[/code]

Niestety nie jest to takie proste, gdyż nie można wtedy zmienić stanu obiektu. After_save jest wywoływany także wtedy gdy zmieniamy stan.

[code=ruby]>> Cv.last.state
=> “awaiting_review”

Cv.last.review!
=> true

Cv.last.state
=> “awaiting_review”[/code]
Narazie zrobiłem to tak ale nie wiem czy to najlepsze wyjście:

[code=ruby] before_save :needs_review, on: :update

def needs_review
self.state = ‘awaiting_review’ unless state_changed?
end[/code]

Jeśli to gem state_machine, to nie zmieniaj tak stanu! Stan zmienia się tylko i wyłącznie poprzez transitions, przeczytaj uważnie dokumentację gema.

Jest to gem ‘workflow’ .