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 .