我正在尝试使用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
这是
答案 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? }