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.
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
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