1

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

当状态为时,我想锁定某些属性的更新completed

但是它不是在状态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

它是

4

1 回答 1

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? }
于 2013-09-12T15:56:01.840 回答