Tengo una aplicación de Rails que permite al 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, he tenido mi results
método (aquella a la que se somete el formulario) hacer lo siguiente:Rails form validation
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, al ver esto repite para cada uno de ellos tiene tedioso. No podía sólo se adhieren a todos en algún bucle para comprobar cada campo, porque los campos están configurados de manera diferente:
- una sola tecla:
params[:name]
- una clave y un sub-clave:
params[:image][:font_size]
- sólo se esperan algunos campos de formulario para ser llenado si otro campo se establece
Etc. Esto también era repetitivo, porque yo estaba sentado flash[:error]
para cada parámetro que falta/no válida, y redirigir a la misma URL para cada uno. Cambié a usar un before_filter
que busca todos los parámetros de formulario necesarios y solo devuelve verdadero si todo está bien. A continuación, el mi método results
continúa, y las variables se acaba de asignar de plano, sin comprobación de que se trate:
@name = params[:name]
En mi método validate_form
, tengo secciones de código como el siguiente:
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
I 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 todavía la técnica más eficiente, porque tengo varios bloques en los que asigno un valor a flash[:error]
, luego los redirecciono a la misma URL y luego devuelvo falso.
Editar para aclarar: La razón por la que no tengo esta validación en el modelo (s) actualmente es por dos razones:
- No estoy tratando de recopilar datos del usuario con el fin de 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. P.ej. 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: que hacen uso de las excepciones específicas de la aplicación ahora, gracias a Jamis Buck Raising the Right Exception article. 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
Creo que no tiene que usar params [: nombre] y! Params [: nombre] .blank? en tus condiciones ! params [: nombre] .blank? es suficiente. params [: name] devuelve false si es nil (no hay tal parámetro) y params [: name] .blank? devuelve verdadero si es nulo o está vacío. – klew
Obtiene un NoMethodError. Podría anular NilClass para agregar #blank? a eso, supongo. irb (main): 002: 0> params = {: a => 1,: b => 2,: c => 3} => {: c => 3,: a => 1,: b => 2} irb (main): 003: 0>! Params [: nombre] .blank? NoMethodError: método indefinido '¿en blanco? ' para nil: NilClass de (irb): 3 –
No Ruby aquí, solo Rails. * etiqueta eliminada * – Nakilon