Forum: Rails-ES Problema paso de parametros

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.
Jose vicente R. (Guest)
on 2009-02-20 17:45
Hola, estoy implementand en mi aplicacion una opcion que permite agregar
una serie  de piezas que se han usado durante la reparacion de un
producto.

Las piezas utilizadas durante la reparacion se seleccionan a traves de
un conjunto de checkboxes. Esta es la vista en si:

<html>
  <head><title>Test Form</title></head>
  <body>
   <h1> Repuestos empleados: </h1>
    <form target="cgi-bin/survey.rb">
       <input type="checkbox" name="repuesto" value="Pantalla LCD" />
          Pantalla LCD<br />
       <input type="checkbox" name="repuesto" value="Oscilador" />
          Oscilador<br />
       <input type="checkbox" name="repuesto" value="carcasa Trasera" />
          Caracasa Trasera<br />
       <input type="checkbox" name="repuesto" value="Carcasa delantera"
/>
          Carcasa Delantera<br />
       <input type="checkbox" name="repuesto" value="Vibrador" />
          Vibrador<br />
       <input type="checkbox" name="repuesto" value="Altavoz" />
          Altavoz<br />
       <input type="checkbox" name="repuesto" value="Microfono" />
          Microfono<br />
       <input type="checkbox" name="repuesto" value="Fraccion minima" />
          Fracción minima<br />

  <br />
  <br />
       <input type="Submit" />
    </form>
  </body>
</html>


En el controlador, si se ha seleccionado algún repuesto pasamos a la
vista del presupuesto para su posterior impresion, como se puede ver le
paso el parametro repuestos al mismo tiempo que hago el redirect a la
vista:

def add_rp_part

@kirk = Kirk.find(params[:id])
@piezas=RpPart.find(:all)

  if (params[:repuesto]!=nil)
    respond_to do |format|
      format.html {
redirect_to(:action=>"printpresupuesto",:id=>@kirk.id,
:repuestos=>params[:repuesto], :value=>params[:value]) }
             end
  end

end


Si solo se selecciona una pieza funciona perfectamente, el problema
viene cuando se han seleccionado varias piezas, si es asi solo se
muestra la primera pieza seleccioanda en la vista.

El fallo esta en el paso de parametros, pues si selecciono por ejemplo
la pantalla LCD y el oscilador la consola muestra esto:

127.0.0.1 - - [20/Feb/2009:16:32:46 CET] "GET
/kirks/add_rp_part/19?repuesto=Pantalla+LCD&repuesto=Oscilador HTTP/1.1"
302 136
http://localhost:3000/kirks/add_rp_part/19 ->
/kirks/add_rp_part/19?repuesto=Pantalla+LCD&repuesto=Oscilador
127.0.0.1 - - [20/Feb/2009:16:32:47 CET] "GET
/kirks/printpresupuesto/19?repuestos=Pantalla+LCD HTTP/1.1" 304 0
http://localhost:3000/kirks/add_rp_part/19 ->
/kirks/printpresupuesto/19?repuestos=Pantalla+LCD


Como se observa al controlador le llegan los dos presupuestos, pero al
hacer el redirect a printpresupuesto solo pasa el primero.


Alguna sugerencia?
Jose vicente R. (Guest)
on 2009-02-20 17:56
Umm...me da que le fallo va a estar aqui:
http://localhost:3000/kirks/add_rp_part/19 ->
> /kirks/add_rp_part/19?repuesto=Pantalla+LCD&repuesto=Oscilador

En verdad repuesto no es un conjunto de valores, sino uno solo. La
cuestion seria crear en el controlador un vector (que no tengo ahora)
con todos los repuestos seleccionados y enviar esto a la vista de la
impresión.

Voy a mirar eso, de todas formas cualquier ayuda es agradecida.

Saludos
Sergio Cambra .:: entreCables - Symbol Servicios (Guest)
on 2009-02-20 17:58
(Received via mailing list)
El Friday 20 February 2009 16:45:56 Jose vicente Ribera pellicer
escribió:
>    <h1> Repuestos empleados: </h1>
>        <input type="checkbox" name="repuesto" value="Vibrador" />
>        <input type="Submit" />
> def add_rp_part
>
> El fallo esta en el paso de parametros, pues si selecciono por ejemplo
> /kirks/printpresupuesto/19?repuestos=Pantalla+LCD
>
>
> Como se observa al controlador le llegan los dos presupuestos, pero al
> hacer el redirect a printpresupuesto solo pasa el primero.
>
>
> Alguna sugerencia?

Tienes todos los checkbox con el mismo nombre, por lo que solo coge el
primer
valor. Pon nombres diferentes o si quieres un array con todos los
valores
marcados, pon de nombre respuesto[]

--
Sergio Cambra .:: entreCables S.L. ::.
Nicolás Guillén 6, locales 2 y 3. 50.018 Zaragoza
T) 902 021 404 F) 976 52 98 07 E) removed_email_address@domain.invalid
Isaac Feliu Pérez (Guest)
on 2009-02-20 18:02
(Received via mailing list)
Jose,

el problema lo tienes porque estas enviando una variable varias veces:
repuesto=foo&repuesto=bar.

Para pasar múltiples valores en una sola variable, (o sea, para enviar
un array de valores), el nombre del parámetro debe acabar en [], o sea:
repuesto[]=foo&repuesto[]=bar

de esta forma, en el controller recibirias params[:repuesto] =
['foo','bar']

en el formulario cambia el nombre del checkbox de name="repuesto" a
name="repuesto[]" y ten en cuenta de adaptar la lógica de tu
controlador con lo que sea necesario.

Saludos,
--
Isaac Feliu
Jose vicente R. (Guest)
on 2009-02-20 18:06
Thanks!!
Jose vicente R. (Guest)
on 2009-02-20 18:39
He intentado hacer lo que me has comentado, en mi caso ya que todos se
llaman repuesto lo mas lógico era construirme un vector.

Asi que en la vista de conlos checkboxes he puesto repuesto[] es en vez
de repuestos.


De la lógica del controlador no he tocado nada, lo unico que cambia es
que ahora como dices params[:repuestos] es un vector con un todos los
repuestos seleccionados. El problema viene en la vista de imprimir
presupuestos y la cuestion es que la direccion que muestra el navegador
es correcta. Ahora muestra:

http://localhost:3000/kirks/printpresupuesto/19?el...

Es decir, ahora si tiene los dos. Sin embargo poniendo algo como esto:

<% if params[:repuestos]=="Oscilador" %>

    <td ><%=h RpPart.find(2).title %></td>
        <td ><%=h RpPart.find(2).price %></td>
        <td ><%=h RpPart.find(2).discount %></td>
          <td ><%=h RpPart.find(2).pricedisc %></td>


<% end %>

No muestra nada, mi idea es ir comparando cada uno elos repuestos que
tengo con el vector que recibo y si esta añadirlo a la tabla de
presupuestos. Pero como digo no muestra nada.


Otra cosa que me ha llamado la atencion es que desde consola me aparece
esto:

127.0.0.1 - - [20/Feb/2009:17:36:49 CET] "GET
/kirks/add_rp_part/19?repuesto%5B%5D=Pantalla+LCD&repuesto%5B%5D=Oscilador
HTTP/1.1" 302 168
http://localhost:3000/kirks/add_rp_part/19 ->
/kirks/add_rp_part/19?repuesto%5B%5D=Pantalla+LCD&repuesto%5B%5D=Oscilador
127.0.0.1 - - [20/Feb/2009:17:36:49 CET] "GET
/kirks/printpresupuesto/19?repuestos%5B%5D=Pantalla+LCD&repuestos%5B%5D=Oscilador
HTTP/1.1" 304 0
http://localhost:3000/kirks/add_rp_part/19 ->
/kirks/printpresupuesto/19?repuestos%5B%5D=Pantalla+LCD&repuestos%5B%5D=Oscilador


y ese sufijo con %5B%5%D que aparece en repuestos no me genera mucha
confianza. Me gustaria implementa el programa como lo tengo y
discriminar cada repuesto en la vista. Pero bueno a una mala me quedaria
la opciond e llamar a cada checkbox de una forma distinta.

Creeis que ese esa coletilla es normal??
Isaac Feliu Pérez (Guest)
on 2009-02-20 18:43
(Received via mailing list)
Jose,

la coletilla de caracteres raros es normal, es la codigificación de
los carácteres "[" y "]" escapados para que sea una url válida, por lo
que es normal.

Por lo que respecta la vista, el problema es que estás comparando un
array con un string, por lo que nunca te entrará en el if

if ["foo", "bar"] = "foo"  <<- Siempre será falso,

lo deberias hacer con:

if ["foo", "bar"].include?("foo")

Saludos,
--
Isaac Feliu
Jose vicente R. (Guest)
on 2009-02-20 18:47
Y yo que iva a hacer sin ti Isaac? ;)

Muchas gracias!
cartuchoGL (Guest)
on 2009-02-20 18:52
(Received via mailing list)
Hola,

Jose vicente Ribera pellicer escribió:
> He intentado hacer lo que me has comentado, en mi caso ya que todos se
> llaman repuesto lo mas lógico era construirme un vector.
>
> ...
Sobre esto no te puedo ayudar :(
> /kirks/add_rp_part/19?repuesto%5B%5D=Pantalla+LCD&repuesto%5B%5D=Oscilador
> la opciond e llamar a cada checkbox de una forma distinta.
>
> Creeis que ese esa coletilla es normal??
>
>
>

Pero no te preocupes por esto, es normal, 5b es [ en hexadecimal y 5d es
] puedes mirar [1] para mas detalles.

[1] http://www.w3schools.com/TAGS/ref_urlencode.asp

Un saludo a todos.
Jose vicente R. (Guest)
on 2009-02-20 18:53
Gracias, ahora ya funciona a las mil maravillas.
This topic is locked and can not be replied to.