2012-10-02 50 views
7

Tengo un formulario con 3 campos de ActiveRecord. Uno de esos campos tiene un tipo de ridículo y requisitos de validación DEPENDIENTES DEL ESTADO. (Por ejemplo, solo valido el campo si el objeto se está creando en un formulario de asistente de configuración.)cómo puede un controlador establecer manualmente errores de validación para un campo determinado

En mi controlador POST para crear el objeto, pensé que podría llamar a errors.add para insertar una condición de error especial

@foo = Foo.new(params[:foo]) 
if goofy_conditions(params[:foo][:goofy_field]) 
    @foo.errors.add(:goofy_field, "doesn't meet the goofy conditions") 
end 
respond_to do |format| 
    if @foo.save 
    ... 
    else 
    ... redirect back to form (with error fields hilited) 

Sin embargo, hacer @ foo.errors.add() en el controlador no parece hacer nada ... no impide el guardado() si los otros campos pasan validaciones.

Una alternativa es poner un controlador de validación personalizado en el modelo ... Sé usar errors.add (: campo, 'msg') funciona bien allí ... pero en ese caso, ¿cómo puede mi controlador 'pasar' información al validador que indica si el campo debe ser validado o no.

+1

poner un attrbute nonpersisted en el modelo, por ejemplo asistente, establecer según corresponda y luego solo usarlo en la validación inicial –

Respuesta

12

Eso es lógica de modelo. Mira custom validations

class GoofyThing < ActiveRecord::Base 
    validate :goofy_attribute_is_goofy 

    def goofy_attribute_is_goofy 
    if goofy_conditions(self.goofy_field) 
     self.errors.add(:goofy_field, "doesn't meet the goofy conditions") 
    end 
    end 
end 

entonces va a actuar como cualquier otra validación.

Editar

Puede validar condicionalmente con la opción :if:

attr_accessible :via_wizard 
validate :goofy_attribute_is_goofy, :if => lambda { self.via_wizard } 

y en su controlador:

class WizardController < ApplicationController 
    before_filter :get_object, :set_wizard 

    #... 

    def get_object 
    @object = GoofyThing.find(params[:id]) 
    end 

    def set_wizard 
    @object.via_wizard = true 
    end 
end 
+0

¡ah! el attr_accessible: via_wizard es lo que extrañé. ¡Muchas gracias! – jpwynn

Cuestiones relacionadas