Evite se repetir com state_machine

ATUALIZAÇÃO: @errinlarsen notou que o código anterior parou de funcionar nas versões recentes de state_machine / rails. Eu atualizei o post para usar Rails Concerns.

Às vezes, quando você está usando state_machine, descobre que há modelos que compartilham o mesmo fluxo de trabalho, por exemplo, quando muitos modelos precisam ser aceitos por um administrador antes de serem publicados e, para evitar a repetição do código, você pode fazer o seguinte:

Adicione uma preocupação em app / models / relevant / shared / optional.rb:

module Shared::Acceptable
extend
ActiveSupport::Concern

included
do
state_machine
:initial => :new do
event :accept do
transition
:new => :published
end

event :reject do
transition
:new => :rejected
end
end
end

end

Inclua o módulo em seus modelos:

class Comment << ActiveRecord::Base
include
Shared::Acceptable

...
end

class Image << ActiveRecord::Base
include
Shared::Acceptable

...
end

Você pode usar o Concerns para compartilhar facilmente funcionalidades, escopos, configurações, validadores ou declarações de relacionamento entre diferentes modelos http://api.rubyonrails.org/classes/ActiveSupport/Concern.html