2011-11-26 9 views
22

Ho un modello sempliceArgumentError: è necessario fornire almeno una validazione con: se

class Task < ActiveRecord::Base 
    validates :deadline, :if => :deadline_in_future? 

    def deadline_in_future? 
    Date.today < self.deadline 
    end 
end 

Tutto sembra ok, ma quando nella mia console rotaie

irb(main):001:0> Task.new 
ArgumentError: You need to supply at least one validation 

Dove è il problema ?

risposta

35

Hai dimenticato di dire validates come si desidera convalidare :deadline. Penso che tu fraintenda cosa fa :if; l'opzione :if => :deadline_in_future? significa:

Validate :deadline only if the deadline_in_future? method returns a true value.

Ho il sospetto che si desidera convalidare che il termine è nel futuro:

validate :deadline_in_future? 

Ulteriori dettagli sono disponibili nel Active Record Validations and Callbacks Guide.

+0

Sì, davvero. Ho frainteso le convalide. Grazie. – Ximik

1

Si dice di non passare nessuna convalida al metodo validates. Come validates :presence, per esempio. Cosa stai cercando di convalidare?

+0

Sto provando a fare una validazione come questa http://guides.rubyonrails.org/active_record_validations_callbacks.html#using-a-symbol-with-if-and-unless – Ximik

+2

Nell'esempio ': presence => true 'dice che la presenza del campo' card_number' deve essere validata ma la validazione deve essere eseguita solo se il metodo 'paid_with_card?' restituisce true. L'idea alla base di questo è che l'ordine dovrebbe avere il numero di credito se il pagamento è stato effettuato tramite carta di credito, ma se il pagamento è stato effettuato non con carta di credito, non è necessario controllare che il numero della carta sia correttamente conservato. –

77

È necessario modificare validates a validate.

+5

grazie, ma perché? – yeyo

+2

@yeyo Perché è una sintassi per la convalida personalizzata. Vedi [Metodi personalizzati in Doc Record Validations attivo] (http://guides.rubyonrails.org/active_record_validations.html#custom-methods) –

Problemi correlati