Pregunta

He estado buscando a través de la fuente de ActiveRecord para averiguar cómo funciona el :if => proc_or_method_name validaciones ActiveRecord, pero los únicos casos de :if en la fuente están en los comentarios que explican cómo la característica debe ser llamado.

Por ejemplo, usted puede tener una línea como la siguiente en un modelo:

validates_presence_of :name, :if => :nameable?

y la validación sólo se comprueba si el método devuelve un valor nameable? Truthy para el modelo dado.

¿Dónde está esta funcionalidad definida en realidad, ya que no puedo encontrar en cualquier lugar de este comportamiento en la fuente (Rails2)?

¿Fue útil?

Solución

La opción :if se comprueba en el activesupport\lib\active_support\callbacks.rb archivo.

El should_run_callback método se llama para comprobar si la devolución de llamada debe ser ejecutado o no.

Mira también en cómo se procesa la cadena de devolución de llamada, a partir del método run_callbacks en el mismo archivo.

Algunos de código v2.3.8 de ese archivo es:

def should_run_callback?(*args)
  [options[:if]].flatten.compact.all? { |a| evaluate_method(a, *args) } &&
  ![options[:unless]].flatten.compact.any? { |a| evaluate_method(a, *args) }
end

Y aquí es como descubrí (por si alguien está interesado):

  1. Rieles descargado v2.3.8 desde github y abrió la cremallera.
  2. grepp'ed para :if en todos los archivos .RB
  3. En una activerecord/CHANGELOG, que se encuentra un comentario que menciona:
    ha añadido el: si la opción para todas las validaciones que, o bien se puede utilizar un bloque o un puntero método para determinar si la validación se debe ejecutar o no. # 1324 [Duane Johnson / jhosteny].
  4. Google'd por ese comentario. Encontrado en un google caché .
  5. encontró que se hizo el comentario / adición en 21/05/05 10:57:18 por David
  6. Fecha 2005-05-21 Situado en rieles github la historia en la página 546 :
  7. ¿Tienes una idea de cómo funciona el :if
  8. encontrado que el código que asignan refiere ya no existía en la v2.3.8. tenía que encontrar la última ubicación de ese código
  9. :if grepp'ed de nuevo y atraves cada archivo que se sentía "bien". llegó a activesupport/lib/active_support/callbacks.rb
  10. buscó :if en el archivo y se encuentra en una sola ubicación, en el should_run_callback método.
  11. Respuesta Publicado
  12. Dedos cruzados y esperó a que la generosidad. : D

Eso fue divertido!

Otros consejos

A partir de los carriles 3, devoluciones de llamada ActiveRecord se definen en active_record / callbacks.rb , pero debido a un ActiveRecord hereda modelo de ActiveModel, entonces usted debe también mirar el active_model / callbacks.rb archivo.

La función de devolución de llamada en sí es un componente separado. De hecho, ActionController antes / después de los filtros son devoluciones de llamada, en realidad. Por esta razón, el sistema de devolución de llamada es un módulo definido en ActiveSupport :: devoluciones de llamada .

Combinar En total, estos 3 pedazos y se obtiene la función de devoluciones de llamada de ActiveRecord.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top