2011-10-30 17 views
9

¿Es posible tener entradas múltiples para la opción :on para la validación validates?Rails valida ... multiple: on options?

algo como lo siguiente:

class Library < ActiveRecord::Base 

    validates :presence => true, :on => [:create, :update, :some_other_action] 

end 

Básicamente me gustaría ejecutar una validación particular, cuando múltiples acciones se denominan en el controlador. Por ejemplo, me gustaría validar alguna información de usuario en la acción create, en una acción update, y posiblemente algunas otras acciones también.

Aunque no quiero que la validación se ejecute en todos los métodos.

Además, si hay una manera más fácil de hacerlo, ¡eso también sería genial!

¡Gracias de antemano!

Respuesta

5

Sí para crear y actualizar!

: on - Especifica cuándo esta validación está activa. Se ejecuta en todos los contextos de validación por defecto (cero), otras opciones son : crear y : actualización

Sin embargo piensan de estos valores como datos de base de datos o crear instrucciones de actualización y no rieles acciones del controlador. Pueden estar haciendo cosas similares a los datos y la base de datos, pero son diferentes.
Por ejemplo, puede tener otro método de raíles que también actualice la base de datos, quizás actualizando diferentes campos; sin embargo, la 'actualización' anterior todavía representará ese método aunque no provenga de una acción de raíles con el nombre 'actualizar'.

+0

En realidad se puede utilizar contextos de validación personalizado.[: on - Especifica el contexto donde esta validación está activa (por ejemplo, on:: create o on:: custom_validation_context) '] (http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method- i-valida). Puede usar '#valid? (: My_context)' o '#save (context:: my_context)'. Desafortunadamente no hay forma de definir múltiples contextos a la vez (ni con 'on:' ni pasando una matriz (o múltiples parámetros) a '#valid?'. –

2

Esto no es posible. ¿Por qué? Estos :on eventos no son nombres de acción dentro del controlador, pero predefinido ActiveRecord (MODEL) eventos, :create o :update o :save

No hay conexión automática entre los métodos de controlador y método de modelo.

0

tenía edición muy similar, donde tuve que saltar la validación de ciertas acciones del controlador, que trató las formas anteriores pero mi problema era poco diferente así que no funcionaron para mí, entonces lo que hice fue utilizado attr_accessor y la configuración a menos que fuera.

Funcionará para su causa sin problemas.

en el Modelo

validates :password, presence: true, unless: :skip_password_validation 

attr_accessor :skip_password_validation 

y cuando viene situación en la que no necesito la validación, acabo de hacerlo realidad en el controlador

@user = User.find(params[:id]) 
@user.skip_password_validation = true