2012-11-01 12 views
9
validate :updatable? # First validation there is 
with_options :if => Proc.new { |object| object.errors.empty? } do |updatable| 
    updatable.with_options :if => "self.current_step == basic" do |step| 
     validates .... bla-bla bla 

Quindi, prima di ogni convalide sono fatti, la subroutine aggiornabile si chiama e popola l'array errors[:base] con errori appropriati, il che significa che oggetto non è aggiornabile. E volevo che saltasse il resto delle convalide se sono stati trovati errori in questa subroutine, ma l'esempio sopra riportato è non funzionante - esegue tutte le convalide.Rails with_option annidati: se usato in validazione

Ma, se cambio :if => "self.current_step == basic" a :if => "self.errors.empty? && self.current_step == basic" funziona come un fascino.

Cosa sto facendo male? Gli esempi mostrano che l'operazione nidificata with_option dovrebbe funzionare.

Qualcuno può aiutarmi? Grazie in anticipo.

+0

Mi sembra che sia un bug, perché le condizioni non vengono unite, quindi solo l'ultima è coinvolta. Spero che qualcuno presterà attenzione a questo e verrà risolto nelle versioni future. – Dmitri

risposta

12

Hai ragione quando nidificando due: se le condizioni, quella interna sostituirà quella esterna e sarà sempre controllata. Una soluzione alternativa per gestire due livelli di nidificazione è:

with_options :unless => !(outer condition) do 
    with_options :if => (inner condition) do 

Le condizioni if ​​e unless non si sovrascrivono. Non sono sicuro che chiamerei un bug, ma sarebbe bello se potessi nidificare più volte: se le condizioni.

+0

Non lo sapevo. Grazie. –

Problemi correlati