[英]rails state machine transitions & guards / validations
我似乎无法弄清楚如何使验证在状态机上正常工作。 IE我想在允许新的发布状态之前进行某些验证:
过渡,我正在使用的gem具有保护方法,但我似乎无法弄清楚如何正确地将其用于多个验证。
尝试仅应用以下基本验证:
validate_presence_of :age, :if => :publish? #
https://github.com/qoobaa/transitions
更新:这看起来像我想要的那样工作,但是我的下一个问题是如何将所有验证集中在一起以简化我的方法? 我觉得我正在使它变得比原来复杂得多,并且不够健壮。 有任何想法吗?
state_machine do
state :draft
state :active
state :offline
event :publish do
transitions :to => :active, :from => :draft, :on_transition => :do_submit_to_user, :guard => :publish?
end
end
def publish?
unless description.blank? || invalid_minimum_feature_tags || invalid_minimum_images
return true
else
errors.add(:description, 'cannot be blank') if description.blank?
errors.add(:feature_list, 'must contain at least 4 features') if invalid_minimum_feature_tags
errors.add(:photos, 'must exceed 4 to publish') if invalid_minimum_images
return false
end
end
def invalid_minimum_images
if photos.size < 4
return true
else
return false
end
end
def invalid_minimum_feature_tags
if feature_list.size < 4
return true
else
return false
end
end
使用SimpleStateMachine ,代码将如下所示:
def publish
unless description.blank? || invalid_minimum_feature_tags || invalid_minimum_images
do_submit_to_user
else
errors.add(:description, 'cannot be blank') if description.blank?
errors.add(:feature_list, 'must contain at least 4 features') if invalid_minimum_feature_tags
errors.add(:photos, 'must exceed 4 to publish') if invalid_minimum_images
end
end
event :publish, :draft => :active
def invalid_minimum_images
...
end
def invalid_minimum_feature_tags
...
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.