转换时的state_machine验证

时间:2013-10-17 17:40:32

标签: ruby-on-rails ruby-on-rails-3 state-machine

使用state_machine gem,我希望获得仅在转换时运行的验证。例如:

# Configured elsewhere:
# StateMachine::Callback.bind_to_object = true

class Walrus > ActiveRecord::Base
  state_machine :life_cycle, :initial => :fetus do
    state :fetus
    state :child
    state :adult
    state :dead

    event :coming_of_age do
      transition :child => :adult
    end


    before_transition :child => :adult do
      validate :coming_of_age_party_in_the_future
    end
  end
end

如果我将该验证附加到成人州,则该日期过后将失败。但我只需要它在过渡期间有效。我可以添加类似的内容:

validate :coming_of_age_party_in_the_future, if: 'adult? && life_cycle_was == "child"'

但这似乎错过了过渡点。

另外,由于我在回调中绑定了对象,它如何有条件地调用'validate',一个类方法? (绑定是必要的,因为回调中的许多方法都是私有的。)

1 个答案:

答案 0 :(得分:1)

您是否考虑过使用transition if: :x功能?

应该是这样的:

event :coming_of_age do
  transition :child => :adult, if: :coming_of_age_party_in_the_future
end

您可以在README

中的'示例'(靠近顶部)或'语法灵活性'(相当远的地方)中看到“类定义”部分