рельсы конечных автоматов переходы и охранники / проверки - PullRequest
2 голосов
/ 22 февраля 2011

Я не могу понять, как заставить проверки корректно работать с конечным автоматом. IE я хотел бы сделать некоторые проверки, прежде чем разрешить новое состояние публикации:

Переходы, у камня, который я использую, есть метод защиты, но я не могу понять, как правильно его использовать для более чем одной проверки.

Попробовал просто применить базовые проверки, например, так:

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

1 Ответ

0 голосов
/ 18 ноября 2011

С 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
...