Forum: Rails-ES Pasar parametros de formulario de vuelta al formulario

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
6547a8859c1f21dfdfa9fa5029db9a46?d=identicon&s=25 Daniel Esparza (tupanka)
on 2009-01-23 17:29
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:       <b>Descripcion:</b></td>
22:     <td>
23:                   <B><FONT SIZE=1 COLOR="RED" FACE="VERDANA"> <%=
nulo("nombre")%> </FONT></B><BR>
24:                   <%= text_field :cliente, :nombre %><br>
25:     </td>
26:   </tr>



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
0e34c56054c414263e933a1b8b3d0d55?d=identicon&s=25 Ruben Davila (rdavila)
on 2009-01-23 19:36
(Received via mailing list)
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| %>
  <p>
  <%= f.label :name, 'Nombre: ' %>
  <%= f.text_field :name %>
  </p>
  <p>
  <%= f.label :name, 'Correo: ' %>
  <%= f.text_field :email %>
  </p>
<% end %>

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

Saludos.
6547a8859c1f21dfdfa9fa5029db9a46?d=identicon&s=25 Daniel Esparza (tupanka)
on 2009-01-23 19:57
> 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
Adce10d7f1dbabcdab8f525a59cec32f?d=identicon&s=25 Andrés Gutiérrez (andresgutgon)
on 2009-01-23 20:57
(Received via mailing list)
>>@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 Esparza <
ruby-forum-incoming@andreas-s.net> escribió:
2c65afe780f8e593d82e92a064636fb4?d=identicon&s=25 William Yanez (wyanez)
on 2009-01-26 05:22
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
Adce10d7f1dbabcdab8f525a59cec32f?d=identicon&s=25 Andrés Gutiérrez (andresgutgon)
on 2009-01-26 09:56
(Received via mailing list)
>>@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 <
ruby-forum-incoming@andreas-s.net> escribió:
2c65afe780f8e593d82e92a064636fb4?d=identicon&s=25 William Yanez (wyanez)
on 2009-01-26 18:31
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
Adce10d7f1dbabcdab8f525a59cec32f?d=identicon&s=25 Andrés Gutiérrez (andresgutgon)
on 2009-01-26 18:38
(Received via mailing list)
>>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 <
ruby-forum-incoming@andreas-s.net> escribió:
6547a8859c1f21dfdfa9fa5029db9a46?d=identicon&s=25 Daniel Esparza (tupanka)
on 2009-01-28 00:42
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.
6547a8859c1f21dfdfa9fa5029db9a46?d=identicon&s=25 Daniel Esparza (tupanka)
on 2009-01-28 00:47
>
> 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
7841fbf022cfe78bff34942b50c483e1?d=identicon&s=25 Ceritium (Guest)
on 2009-02-18 23:32
(Received via mailing list)
2009/1/23 Daniel Esparza <ruby-forum-incoming@andreas-s.net>

> 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 :P


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.
This topic is locked and can not be replied to.