2011-05-17 10 views
5

Necesito ayuda con mi modelo ActiveRecord. Tengo validaciones basadas contexto (MIS) utilizando las opciones de contexto build-in para las validaciones:Contexto de validación de rieles

validates :foo, :on => :bar, :presence => true 

model = Model.new 
model.foo = nil 
model.valid? # => true 
model.save # works as expected 

model.valid?(:bar) # => false 
model.save(:context => :bar) # fails and returns false 

pero usando mi modelo en un accepts_nested_attributes_for :model y llamando parent.save falla (la validación se llama y devuelve falso), cualquier sugerencia o soluciones ?


¿Todavía no tiene respuesta? Para explicar más sobre mi problema: Tengo un modelo llamado Form que tiene muchos Field s. Los usuarios deben ver los errores de validación en el envío, pero el formulario debe guardarse de todos modos (con y sin errores). Existen diferentes tipos de Field s, cada uno con validaciones globales (para garantizar la consistencia de la base de datos) y sus propias validaciones específicas definidas por el usuario (para validar los datos ingresados ​​por el usuario). Así que mis Field s buscan alguna manera de esa manera:

# Global validations, to ensure database consistency 
# If this validations fail, the record should not be saved! 
validates_associated :form, :on => :global 
... 

# Specific user-defined validations 
# If this validations fail, the record should be saved but marked as invalid. (Which is done by a before_save filter btw.) 
def validate 
    validations.each do |validation| # Array of `ActiveModel::Validations`, defined by the user and stored in a hash in the database 
    validation.new(:on => :specific).validate(self) 
    end 
end 

En mi controlador:

# def create 
# ... 
form.attributes = params[:form] 
form.save!(:global) 
form.save(:specific) 

es algo parecido posible en los carriles utilizando la funcionalidad integrada? Por cierto, este no es mi código real, que es bastante complicado. Pero espero, ustedes entenderán la idea.

Respuesta

0

Cambie has_nested_attributes_for :model a accepts_nested_attributes_for :models.

Espero que esto ayude.

Buena suerte.

+0

No, lo siento por el error tipográfico. Quise decir, por supuesto, 'accept_nested_attributes_for'! Gracias por cierto :) –

+0

Creo que el contexto de validación ': bar' está mal, pero': on =>: create' o ': on =>: update' debería estar bien. – Danil

6

Trate validaciones condicional

class Customer 
    attr_accessor :managing 

    validates_presence_of :first_name 
    validates_presence_of :last_name 

    with_options :unless => :managing do |o| 
    o.validates_inclusion_of :city, :in=> ["San Diego","Rochester"] 
    o.validates_length_of :biography, :minimum => 100 
    end 
end 

@customer.managing = true 
@customer.attributes = params[:customer] 
@customer.save 
Cuestiones relacionadas