2009-01-08 26 views
16

Tengo un modelo de rieles que valida la unicidad de 2 valores de formulario. Si estos 2 valores no son únicos, los errores de validación se muestran y el botón "enviar" se cambia a "reenviar". Quiero permitir que un usuario haga clic en el botón "reenviar" y omita la validación del modelo. Yo a querer hacer algo así de la documentación de validación rieles:Rails validación condicional de derivación

validates_uniqueness_of :value, :unless => Proc.new { |user| user.signup_step <= 2 }

pero no tienen valor en mi aa modelo que pueda comprobar para que ... sólo los parametros que tienen el valor "Volver a enviar".

¿Alguna idea sobre cómo hacer esto?

Respuesta

39

En mi opinión esta es la mejor manera de hacerlo:

class FooBar < ActiveRecord::Base 
    validates_uniqueness_of :foo, :bar, :unless => :force_submit 
    attr_accessor :force_submit 
end 

continuación, en su opinión, asegúrese de que el nombre de la etiqueta presentar como

<%= submit_tag 'Resubmit', :name => 'foo_bar[force_submit]' %> 

esta manera, toda la lógica está en el modelo, el código del controlador seguirá siendo el mismo.

+0

esto parece EXACTAMENTE lo que yo quería hacer. Lo intentaré hoy cuando empiece a trabajar. – hacintosh

+0

funcionó genial gracias! – hacintosh

+2

si está utilizando Devise y no desea cambiar la vista, puede anular RegistrosController para establecer foobar [force_submit] en los parámetros antes de enviarlo a Devise :: RegistrationsController. No olvides configurar 'attr_accessible: force_submit' en el modelo (Rails 3.x) o el force_submit no se actualizará. –

9

Prueba esto:

Carriles 2: Model.save(false)
Rails 3: Model.save(:validate => false)

que no pasa las validaciones (todas ellas sin embargo).

+1

Mi título era un poco engañoso ... No quiero omitir totalmente todas mis validaciones, solo las 2 validates_uniqeness_of – hacintosh

+1

Acabo de tropezar con esto. Deberías usar 'object.save (: validate => false)' cuando uses Rails 3. –

+0

Buen punto Jaap, envié editar para agregar eso a la respuesta. – junky

2

No es positivo al respecto, pero podría intentar agregar un attr_accessor a su modelo para mantener si el formulario se envió antes o no.

sólo tiene que añadir

attr_accessor :submitted

a su modelo y comprobar si en sus validaciones.

1

Puede simplemente mirar el botón enviar para determinar si desea realizar las validaciones.

def form_method 
    case params[:submit] 
    when "Submit" 
     'Do your validation here' 
    when "Resubmit" 
     'Do not call validation routine' 
    end 
end 
Cuestiones relacionadas