使用state_machine保护属性

时间:2013-09-12 14:28:37

标签: ruby-on-rails validation model ruby-on-rails-4 state-machine

我正在尝试使用state_machine保护某些属性的更新,但我似乎无法让它正常工作。

我希望在状态为completed

时锁定某些属性的更新

但不是在STATE completed上触发,而是在转换到完成期间触发......意味着在状态完成之前,完全阻止状态!

例如

  ## BLOCK CHANGES MADE IN COMPLETED OR FAILED STATE
  validate :lock_down_attributes_when_published, :if => Proc.new { |log| log.state?(:completed) }

  validate :lock_down_attributes_when_published, :if => Proc.new { |log| log.completed? }

  private

  def lock_down_attributes_when_published
    return unless completed?
    message = "must not change when #{state}"
    errors.add(:head_count, message) if head_count_changed?
    errors.add(:quiz_master_id, message) if quiz_master_id_changed?
    errors.add(:qm_fee, message) if qm_fee_pennies_changed?
    errors.add(:total_fee, message) if total_fee_pennies_changed?
  end

这是

1 个答案:

答案 0 :(得分:1)

这不是最优雅的解决方案,但你可能会抛出脏方法state_changed?结合起来,它应该为您提供所需的功能。

Proc.new { |log| log.completed? && !log.state_changed? }

这样只有在完成状态改变后才会触发。

validate :lock_down_attributes_when_published, :if => Proc.new { |log| log.completed? && !log.state_changed? }