validator validations validate rails method custom create active ruby-on-rails forms validation

ruby on rails - validations - Rieles forman validación



validate destroy rails (3)

Parece que está haciendo la validación en el controlador, intente ponerlo en el modelo, es más adecuado para ese tipo de cosas.

Tengo una aplicación de Rails que permite a un usuario construir una consulta de base de datos completando un formulario extenso. Me pregunté cuál sería la mejor práctica para verificar los parámetros de formulario en Rails. Anteriormente, mi método de results (el que envía el formulario) hace lo siguiente:

if params[:name] && !params[:name].blank? @name = params[:name] else flash[:error] = ''You must give a name'' redirect_to :action => ''index'' return end

Pero para varios campos de formulario, ver esto repetido para cada uno se volvió tedioso. No podía simplemente pegarlos todos en un bucle para verificar cada campo, porque los campos están configurados de manera diferente:

  • una sola clave: params[:name]
  • una clave y una clave secundaria: params[:image][:font_size]
  • solo esperar que se completen algunos campos de formulario si se configuró otro campo

Etc. Esto también fue repetitivo, porque estaba configurando flash[:error] para cada parámetro faltante / inválido y redirigiendo a la misma URL para cada uno. before_filter a usar un before_filter que busca todos los parámetros de formulario necesarios y solo devuelve verdadero si todo está bien. Luego, el método de mis results continúa y las variables se asignan por completo, sin verificación alguna:

@name = params[:name]

En mi método validate_form , tengo secciones de código como las siguientes:

if ( params[:analysis_type][:to_s] == ''development'' || params[:results_to_generate].include?(''graph'') ) {:graph_type => :to_s, :graph_width => :to_s, :theme => :to_s}.each do |key, sub_key| unless params[key] && params[key][sub_key] flash[:error] = "Cannot leave ''#{Inflector.humanize(key)}'' blank" redirect_to(url) return false end end end

Me preguntaba si estoy haciendo esto de la mejor manera, o si me falta algo obvio cuando se trata de la validación de parámetros. Me preocupa que esta no sea la técnica más eficiente, porque tengo varios bloques en los que asigno un valor a flash[:error] , luego redirijo a la misma URL, y luego devuelvo falso.

Editar para aclarar: La razón por la que no tengo esta validación en el / los modelo (s) actualmente es por dos razones:

  • No estoy tratando de recopilar datos del usuario para crear o actualizar una fila en la base de datos. Ninguno de los datos que envía el usuario se guarda después de cerrar la sesión. Todo se usa correctamente cuando lo envían para buscar en la base de datos y generar algunas cosas.
  • El formulario de consulta toma datos pertenecientes a varios modelos y toma otros datos que no pertenecen a ningún modelo. Por ejemplo, el tipo de gráfico y el tema que se muestran arriba no se conectan a ningún modelo, solo transmiten información sobre cómo el usuario desea mostrar sus resultados.

Editar para mostrar una técnica mejorada: ahora uso excepciones específicas de la aplicación, gracias al artículo de Raising the Right Exception de Jamis Buck. Por ejemplo:

def results if params[:name] && !params[:name].blank? @name = params[:name] else raise MyApp::MissingFieldError end if params[:age] && !params[:age].blank? && params[:age].numeric? @age = params[:age].to_i else raise MyApp::MissingFieldError end rescue MyApp::MissingFieldError => err flash[:error] = "Invalid form submission: #{err.clean_message}" redirect_to :action => ''index'' end


Puedes probar active_form ( http://github.com/cs/active_form/tree/master/lib/active_form.rb ) - solo ActiveRecord menos las cosas de la base de datos. De esta forma, puede usar todas las validaciones de AR y tratar su formulario como lo haría con cualquier otro modelo.

class MyForm < ActiveForm validates_presence_of :name validates_presence_of :graph_size, :if => # ...blah blah end form = MyForm.new(params[:form]) form.validate form.errors


Si volviera a abordar el problema hoy, podría crear un modelo para el conjunto de parámetros de consulta y usar las validaciones integradas de Rails, Rails 3 lo hace mucho más fácil con ActiveModel :: Validations vea esta publicación .