繁体   English   中英

Rails状态机转换和防护/验证

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM