Pasar parametros de formulario de vuelta al formulario


#1

Hola, estoy tratando de hacer un formulario que al ser enviado se vuelve
a cargar con los mismos datos si tiene errores, tales como datos
obligatorios omitidos, pero no lo he logrado.

Estoy creando mi propio método de validación, por favor no me
recomienden otros métodos, que esto me sirve para aprender. De todas
formas ya he visto varios.

tengo claro que al enviar una variable de instancia como:

@cliente=Cliente.find(:first)

Entonces en el formulario puedo mostrar lo valores de los campos en
campos de texto de la forma:

<%= text_field :cliente, :nombre %>

Tan bien se que cuando en un metodo recibo los parametros de ese
formulario los recibo mediante params[:clie] que vendria siendo una
especie de hash o arreglo (no estoy seguro)

Ahora bien, si al evaluar los parametros que vienen del formulario (del
tipo form_remote_tag) determino que hay un error, mando a cargar ese
formulario nuevamente, en una capa por cierto.

lo que estaba haciendo en el metodo era cargar los datos del formulario
en una session

session[:cliente]=params[:cliente]

y en la vista del formulario los “bajaba” a una variable de instancia
asi:

<% params[:clie]=session[:clie] %>

luego esperaba que en los campos se mostrara nuevamente los valores
tomados pero no es así. en lugar de eso, revisando el log, me arroja el
siguiente error:

ActionView::TemplateError (undefined method `nombre’ for
#HashWithIndifferentAccess:0x469284c) on line #24 of
app/views/generales/clientes/_formClientes.html.erb:
21: Descripcion:
22:


23: <%=
nulo(“nombre”)%>


24: <%= text_field :cliente, :nombre %>

25:
26:

haciendo mas pruebas me di cuenta de que podia hacer esto en la vista:

<%= params[:clie][:clie_descri] %>

y si me funcionaba, me traia de vuelta el valor que ya habia ingresado
anteriormente. Pero sigo sin saber como puedo colocar ese valor en los
campos de texto

Asi que
¿que debo hacer para que en formulario me tome nuevamente los valores
que ya había ingresado y que le envio desde el metodo?

Perdon por lo largo del post, pero creo que esto podria ayudar a muchos
que anden tras esto.

Gracias de antemano


#2

Hola Daniel, esto se maneja automaticamente si se usan los helpers de
formulario form_for o form_remote_form, ejemplo

#users_controllers.rb
def new
@user = User.new
end

def create
@user = User.new(params[:user])
if @user.save
flash[:success] = ‘Usuario creado correctamente’
redirect_to users_url
else
# Al momento de renderizar esta vista la variable de instancia @user
# ya tendra los valores asignados en sus atributos name y email
render :action => :new
end
end

#new.html.erb
<% form_for :user, :url => users_path do |f| %>

<%= f.label :name, 'Nombre: ' %> <%= f.text_field :name %>

<%= f.label :name, 'Correo: ' %> <%= f.text_field :email %>

<% end %>

Espero que este ejemplo aclare al menos parte de tus dudas.

Saludos.


#3

def create
@user = User.new(params[:user])
if @user.save
flash[:success] = ‘Usuario creado correctamente’
redirect_to users_url
else
# Al momento de renderizar esta vista la variable de instancia @user
# ya tendra los valores asignados en sus atributos name y email
render :action => :new
end
end

La linea util para mi fue:

@user = User.new(params[:user])

en el controlador puse:

@cliente = Cliente.new(params[:cliente])
session[:cliente]=@cliente

y en la vista puse:

@cliente=session[:cliente]

despues de eso los campos de texto tomaron los valores tal como yo
queria

Me funciono perfectamente

Espero que este ejemplo aclare al menos parte de tus dudas.

Saludos.

Gracias Ruben saludos


#4

Andrés Gutiérrez wrote:

@cliente = Cliente.new(params[:cliente])
session[:cliente]=@cliente

y en la vista puse:

@cliente=session[:cliente]

Amigo Andrés:
Si en el controlador haces
@cliente = Cliente.new(params[:cliente])
la variable @cliente esta disponible para usarla en la vista sin
necesidad de usar variables de session, tal cual el ejemplo de Ruben.
Es decir todas las variables que en el controlador comiencen por @
(variables de instancia) están disponibles para la vista asociada al
método donde se declare la variable o cualquiera que llamemos desde allí
usando render.

Espero haberte aclarado,

William Yánez


#5

@cliente = Cliente.new(params[:cliente])
session[:cliente]=@cliente

Hola Willian:
Precisamente este fin de semana he trabajado con form_for y recursos
anidados. Lo he pillado. Lo que yo decía es que Daniel esta almacenando
todo
lo que le viene de la vista (de un form_for, por ejemplo) en una
variable de
sesión. ¿Es esto optimo-correcto-deseable? Esa es mi duda.

Un saludo

El 26 de enero de 2009 5:22, William Yanez <
removed_email_address@domain.invalid> escribió:


#6

@cliente = Cliente.new(params[:cliente])
session[:cliente]=@cliente

y en la vista puse:

@cliente=session[:cliente]

despues de eso los campos de texto tomaron los valores tal como yo
queria

Me funciono perfectamente

No sé si te funciono o No, pero (que me corrija alguien sino es así) me
parece que es una cagada meter información en las variables de sesión y
creo
que usarlas en las vistas también. Creo
que lo que te ha recomendado Ruben es lo que tienes que hacer. Yo
copiaría
su ejemplo entero y lo adaptaría a mi problema. Pero ya te digo que
estoy
empezando e igual te estoy diciendo una burrada

Un saludo

El 23 de enero de 2009 19:57, Daniel E. <
removed_email_address@domain.invalid> escribió:


#7

Claro Andrés tienes razon! mi post anterior iba dirigido a Daniel que
fue el que hizo el codigo con la variables de session y no tu… me
disculpo por ello.

Como tu mencionastes inicialmente y yo contribuí a aclarar no es
necesario hacer
session[:x]=@x ya que @x esta disponible en el controlador y vista
asociada, por lo tanto no es necesario ni deseable ni correcto ni
óptimo, ya que precisamente rails tiene esta característica para, entre
otras cosas, evitar el uso indiscriminado de las variables de session
(típico cuando uno viene de PHP).

Espero que ahora si quede aclarado el punto.

Andrés Gutiérrez wrote:

@cliente = Cliente.new(params[:cliente])
session[:cliente]=@cliente

Hola Willian:
Precisamente este fin de semana he trabajado con form_for y recursos
anidados. Lo he pillado. Lo que yo decía es que Daniel esta almacenando
todo
lo que le viene de la vista (de un form_for, por ejemplo) en una
variable de
sesión. ¿Es esto optimo-correcto-deseable? Esa es mi duda.

Un saludo


#8

William Yanez wrote:

Andrés Gutiérrez wrote:

@cliente = Cliente.new(params[:cliente])
session[:cliente]=@cliente

y en la vista puse:

@cliente=session[:cliente]

Amigo Andrés:
Si en el controlador haces
@cliente = Cliente.new(params[:cliente])
la variable @cliente esta disponible para usarla en la vista sin
necesidad de usar variables de session, tal cual el ejemplo de Ruben.
Es decir todas las variables que en el controlador comiencen por @
(variables de instancia) están disponibles para la vista asociada al
método donde se declare la variable o cualquiera que llamemos desde allí
usando render.

Espero haberte aclarado,

William Yánez

Bueno amigos lo de las variables de instancia lo tengo claro hace
tiempo. En el post lo coloque asi, por que el programa es copia de otro
muy parecido donde si hacia falta colocar la variable de instancia. El
punto de este hilo no era ese, si no la aclaratoria que hizo el amigo
Andrés.

En este caso hay una buena razon para hacerlo asi(usar una session de
todas formas), razon que no detallé, por que ese no era el punto y seria
mucho mas largo de explicar.

De todas formas vale la pena la aclaratoria para que los mas nuevos no
se confundan.


#9

Espero que ahora si quede aclarado el punto.

Super claro, perdoname a mi si te he parecido mosqueado o algo…

Un saludo

El 26 de enero de 2009 18:31, William Yanez <
removed_email_address@domain.invalid> escribió:


#10

Bueno amigos lo de las variables de instancia lo tengo claro hace
tiempo. En el post lo coloque asi, por que el programa es copia de otro
muy parecido donde si hacia falta colocar la variable de instancia. El
punto de este hilo no era ese, si no la aclaratoria que hizo el amigo
Andrés.

quise decir el amigo RUBEN fue quien me ayudo


#11

2009/1/23 Daniel E. removed_email_address@domain.invalid

Hola, estoy tratando de hacer un formulario que al ser enviado se vuelve
a cargar con los mismos datos si tiene errores, tales como datos
obligatorios omitidos, pero no lo he logrado.

Estoy creando mi propio método de validación, por favor no me
recomienden otros métodos, que esto me sirve para aprender. De todas
formas ya he visto varios.

Tu propio método de validación?

Te refieres a hacerlo a pelo con ruby? o usar otras herramientas que te
ofrece rails distintas al validate_presence_of y similares?

Si es lo primero, no se para que usas un framework si prefieres hacerte
tus
propias herramientas.

Si por lo que sea es porque sus herramientas se te quedan cortas pues
adelante :stuck_out_tongue:

Por otro lado creo que ya te han respondido bien, en el método “create”,
“update”, o el que sea, haces un @objeto = params[:objecto]

y luego un render :action => ‘vista del formulario’

y te cargará los datos que metiste con su errors en las validaciones.