2011-05-02 19 views
5

Disculpa si esta es una pregunta realmente común y/o ridícula; Juro que he leído la documentación varias veces y todo parece estar tan enfocado en ActiveRecord hasta el punto en que se salieron de la ruta de los formularios que hacen algo más que crear o editar datos de modelos.Rails 3: Mostrar errores de validación para un formulario (no guarda un modelo de ActiveRecord)

Tome por ejemplo un formulario con entradas para controlar la extracción y visualización de algunas estadísticas. ¿Qué me proporciona los rieles para validar la entrada del usuario de este formulario, que no invocará save en ningún registro? Cosas como:

  • :email debe ser una dirección de correo electrónico
  • :num_products debe ser un número entero positivo
  • :gender debe ser uno de "M" o "F"
  • :temperature debe estar entre -10 y 120

, etc, etc (el tipo de cosas que viene de serie en la mayoría de los frameworks web) ...

¿Hay algo en Rails que pueda llevar a cabo esta validación arbitraria y alguna vista de ayuda para mostrar una lista de errores, o todo está acoplado con ActiveRecord?

Disculpas si he pasado por alto esto en la documentación, pero this y this realmente no lo cubren, al menos tan lejos como lo pueden ver los ojos cansados.

arañazos cabeza

Gracias a la respuesta de Rob, esto es lo que he llegado con. Creé una clase de utilidad (acertadamente llamada Validator) que solo está incorporada en mis controladores para todo lo que la necesita.

module MyApp 

    class Validator 
     include ActiveModel::Validations 
     include ActiveModel::Conversion 
     extend ActiveModel::Naming 

     def initialize(attributes = {}) 
      super 
      attributes.each { |n, v| send("#{n}=", v) if respond_to?("#{n}=") } 
     end 
    end 

end 

Ahora en el controlador, por ejemplo, acaba de definir una pequeña línea de clase:

class LoginController < ApplicationController 
    class AuthenticationValidator < MyApp::Validator 
     attr_accessor :email 
     attr_accessor :password 
     validates_presence_of :email, :message => "E-mail is a required field" 
     validates_presence_of :password, :message => "Password cannot be blank" 
    end 

    def authenticate 
     if request.post? 
      @validator = AuthenticationValidator.new(params) 
      if @validator.valid? 
       # Do something meaningful 
      end 
     end 
    end 

Se siente un poco innecesario para pegar cada conjunto de reglas de validación en su propio .rb cuando la lógica es más orientado a los controladores en mi humilde opinión. Probablemente haya una forma más concisa de escribir esto, pero soy bastante nuevo para Ruby and Rails.

Respuesta

6

Sí, se puede hacer con bastante facilidad.

Puede usar la API validations para ello.

Como ejemplo, aquí tenemos un modelo de contacto que utilizo para una aplicación que no utiliza ActiveRecord.

class ContactUs 
    include ActiveModel::Validations 
    include ActiveModel::Conversion 
    extend ActiveModel::Naming 

    attr_accessor :name, :email, :subject, :message 
    validates_presence_of :name, :email, :message, :subject 
    validates_format_of :email, :with => /\A[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}\z/ 
    def initialize(attributes=nil) 
    attributes.each do |name, value| 
     send("#{name}=", value) 
    end unless attributes.nil? 
    end 

    def persisted? 
    false 
    end 
end 
+0

Excelente, ¡gracias! Recogeré esto :) Supongo que todo lo que necesito leer es 'ActiveModel :: Validations' en la referencia de la API. :) EDITAR | Lo sentimos, se pasó por alto el enlace incrustado. – d11wtq

+0

Esto era exactamente lo que necesitaba, gracias. He utilizado este enfoque para crear una clase abstracta de "Validador" más genérica para eliminar el código repetitivo del método de inclusión/inicialización. – d11wtq

0

Hay un método válido en el modelo, que activa la validación.

así que en su lugar model.save, prueba model.valid?

+0

Estoy tratando específicamente de entender si puedo hacer la validación en la entrada del usuario, no en un modelo. Digamos que no estoy cargando ningún modelo, y en realidad estoy interactuando con algo así como la API de Twitter ... ¿cómo podría validar la entrada del usuario antes de hacer las llamadas a la API?Sé que podría hacerlo manualmente, pero parece que algo debe estar ahí. :) – d11wtq

+0

Otro escenario es algo así como el inicio de sesión de usuario, donde los campos son "correo electrónico" y "contraseña", y quiere fallar la validación del formulario si el parámetro "correo electrónico" no se parece a una dirección de correo electrónico. En este punto, no tiene un modelo para validar; todo lo que tienes es una entrada de usuario. – d11wtq

+0

Oh, lo siento, no entendí la pregunta. Veo que Rob ya respondió la pregunta correctamente, así que echa un vistazo a su respuesta. – sparrovv

Cuestiones relacionadas