Rails state_machine - условная проверка? - PullRequest
2 голосов
/ 25 октября 2011

При использовании state_machine, как вы можете условно проверять поля следующим образом?

state :unlit do      
end

state :fire do
  if is_big_fire?
    validates_presence_of :big_log
  end
  if is_small_fire?
    validates_presence_of :small_log
  end
end

Кажется, что просто игнорируются условия if и проверяется все внутри состояния D:

Единственное своего рода решение , которое я придумал, было

validates_presence_of :big_log, :if  => Proc.new { |fire| fire.is_big_fire? }

Но это сводит с ума, если есть больше проверок.

validates_presence_of :big_log, :if  => Proc.new { |fire| fire.is_big_fire? }
validates :fire_epicness_rating, :inclusion => { :in => %w(epic whowa RUNFORTHEHILLS) }, :if  => Proc.new { |fire| fire.is_big_fire? }
etc

Есть ли хороший способ аккуратнозавернуть их в блоки if?

Ответы [ 2 ]

3 голосов
/ 25 октября 2011

Группировка проверок благодаря with_options действительно аккуратна.Смотри здесь .

2 голосов
/ 11 июля 2013

Вот пример использования with_options для проверки группы.

  with_options :if => :driver? do |driver|
    driver.validates_presence_of :truck_serial
    driver.validates_length_of :truck_serial, :maximum => 30
  end

  def driver?
    roles.any? { |role| role.name == "driver" }
  end 

Источник: http://rubyquicktips.com/post/411400798/conditional-validation-using-with-options-to-improve

...