寻找好的RoR方式来正确验证记录的状态

时间:2012-06-25 16:30:11

标签: ruby-on-rails

我有一个模型,这个模型的一列代表一个状态。它是数值,可能是1,2,3。

我有两个问题:

a)根据业务逻辑,状态只能从1到2,从2到3。它不能从较高的数字返回到较低的数字,而不能只在1到3之间步骤

b)我不想将这些数字暴露给控制器(不喜欢飞来飞去的神奇数字)。

我做了以下

  • 我创建了stateX?,stateY ?, stateZ等方法?允许控制器检查当前状态。 这有助于我关注b)。

  • 如果控制器执行了不可接受的状态切换,我创建了方法setStateX,setStateY,stateZ和raise。这有助于我关注a)和b)。

但是,我觉得Java / C ++方式更多(这是我的背景) - 6种方法可以做一件事。

在RoR中有没有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

不确定这是否仍然是最好的方法(我的Rails有点生锈)但是有一个名为acts_as_state_machine的宝石,我认为它会完全符合您的要求。

答案 1 :(得分:0)

这个怎么样:

class Something < ActiveRecord::Base
  before_create :check_state


  private

  def check_state
    if state_changed?
      if state_was == 1 && state != 2
        self.errors.add(:state, "some message")
      elsif state_was == 2 && state != 3
        self.errors.add(:state, "some message")
      else
        self.errors.add(:state, "some message")
      end
    end
  end

end