Ruby on rails 正在寻找正确验证记录状态的好方法

Ruby on rails 正在寻找正确验证记录状态的好方法,ruby-on-rails,Ruby On Rails,我有一个模型,这个模型的一列表示一个状态。它是数值,可以是1,2,3 我有两个顾虑: a) 根据业务逻辑,状态只能从1变为2,从2变为3。它不能从高数回到低数,也不能一步从1到3 b) 我不想把这些数字暴露给控制器(不喜欢神奇的数字四处飞舞) 我没有跟随 我创建了stateX?,stateY?,stateZ?允许控制器检查当前状态。 这有助于我解决问题b) 我在其中创建了方法setStateX、setStateY、stateZ和raise,如果控制器没有进行不可接受的状态切换。这有助于我解决问

我有一个模型,这个模型的一列表示一个状态。它是数值,可以是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中实现这一点?

不确定这是否仍然是最好的方法(我的导轨有点生锈),但有一种叫做gem的东西,我想它会完全满足您的需要。

这个怎么样:

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
class Something
谢谢。我不确定我是否会使用这个gem,但是使用状态机gem确实是一个好主意。是的,我有一段时间没有使用Rails了,所以我不知道最新的状态机gem是什么,但是
acts\u as\u state\u machine
是我使用的,它工作得很好。