LoginSignup
11
8

More than 5 years have passed since last update.

Ruby: state_machineがメンテされてないのでaasmに移行した

Posted at

Rails4.2でActiveRecord Enumとか出ましたが、状態遷移を気持よくやろうとするとやっぱりなんかgemが欲しい。

state_machine 生きてない..?

あんまりメンテされてないみたいです。

pluginaweek/state_machine
https://github.com/pluginaweek/state_machine

Rails4.1ぐらいまではパッチ当ててなんとか使っていたけどそろそろ無理。

aasm いい感じよ!

機能的に100%互換ではないけど、大体syntaxが似ているし、state_machineでうまく扱えなかった継承関係もうまくやれる!

aasm/aasm
https://github.com/aasm/aasm

移行時に注意したこと

使い方は README.md 読んでね。

bangをつけないと保存されない

state_machine.rb
job.run #=> ダメなときはfalse
job.run! #=> ダメなときはエラーが出る

でも保存されたんだけど、aasmはされない。値が変わるだけ。
なので、ひとつひとつbangつけた。

:from => :toなsyntaxが使えないので書き換え

state_machine.rb
transition :hoge => :hogehoge

な記法は気持ちよかったけどない。

aasm.rb
transitions from: :hoge, to: :hogehoge

may_[state_name]?な書き方できるのいいね

state_machineではcan_[state_name]?だったかな?

with_stateではなくscopeへ

state_machine.rb
class Job
  state_machine do
    state :hoge
  end
end

Job.with_state(:job)
aasm.rb
class Job
  aasm do
    state :hoge
  end
end

Job.hoge

ActiveRecord Enumみたいな感じでscope定義してくれる。
無効にも出来るけど、直感的なのであったほうがいいかな。

その他

  • ## 地味にtransitionではなくtransitions
  • anyはないがそもそも省略できる

Qiita久しぶりすぎてやばい!

11
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8