Forum: Rails-ES Ayuda en conceto

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.
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2008-11-14 19:33
Sigo con mi poryecto y me asaltan dudas, os explico: La empresa genera
una serie de tickets de reparacion (entre otros) que se llama polycom
kirk.

Actualmente tengo diseñado la vista paginada de los tickets, mostrando
en una tabla la informacion que me interesa saber de un vistazo rapido,
tengo una opcion para pasar los documentos a pdf (aun no operativa pues
no muestro ni por asomo todo lo que quiero mostrar aun, pero al menos
logro que le plugin carge el pdf con chorradas que le pongo)y un
buscador.

Ahora lo que me interesaria es poder seleccionar los tickets que
quisiera y tener la opcion de pasarlos a un excel en el que mostrara los
campos que me interesasen del ticket en cuestion. En otra parte de la
aplicacion ya genero una excell, pero o bien la genero de todos los
tickets de esa aplicacion o de los que encuentro tras la busqueda, nunca
a partir de una seleccion manual. Lo que me interesaria seria añadir un
checkbox y pasar a excel unicamente los que estan seleccionados.

¿Como lo planteo? Os explico lo que estoy pensando y me dais vuestra
opinion, pues no lo acabo de ver claro. Yo creo que tendre que añadir
una columna que se llame por ejemplo seleccion manual y en el index que
actualmente tengo algo asi:

########################
class KirksController < ApplicationController
  # GET /kirks
  # GET /kirks.xml

    def index
    if (params[:buscar].nil?) # params[:buscar]=nil #usease sino e
introducido nada en buscar
     @kirks = Kirk.paginar(params[:page])  # pagino las incidencias
     else
     @kirks = Kirk.buscar(params[:buscar])  #si busco entonces me
mostrara la busqueda, #asi soluciono el inconveniente de que
will_paginate solo me permite una opcion de busuede en el campo options
     end
  end
###########################
añadir un if para el chekbox, si esta seleccionado @kirks seran los
kirks que tengan este campo marcado y a la hora de exportar decir lo
mismo, que exporte solo esos, algo asi:
<table border="1" id="doc">
  <tr>
    <td>Nivel</td>

    <td>Cliente</td>        #Aqui el nombre de las tablas

    <td>Estado</td>
  </tr>
  <%=render :partial=> "incidence", :collection=>@kirks %>
  </table>

##############################

El problema que veo es que cada kirk tendra un checkbox y no sera una
variable como por ejemplo :buscar que solo evalua una, aqui tendria que
evaluarla en todos los kirks y no veo como hacerlo....alguna orientacion
porfavor
0e34c56054c414263e933a1b8b3d0d55?d=identicon&s=25 Ruben Davila (rdavila)
on 2008-11-14 20:22
(Received via mailing list)
Hola Jose, si es que he llegado a entenderte bien, algo asi necesitarias
en
tu vista:

<% form_tag(resource_path, :onSubmit => 'return
checkSelectedElements();')
do %>
...
<% @tickets.each do |ticket| %>
  <tr>
    <td><%= check_box_tag 'ticket_ids[]', ticket.id, false, :class =>
'validate-one-required' %></td>
    ....
  </tr>
...
<% end %>

Entonces en el controlador tendras disponible params[:ticket_ids] con
todos
los ids de los tickets que se han seleccionado, adicionalmente puedes
verificar que se haya seleccionado al menos uno mediante javascript:

function checkSelectedElements(){
  selected = $$('.validate-one-required').any(function(e) {return
e.checked
== true;} );
  if (selected) {
    if (confirm('Seguro que deseas ... estos registros?')){
      return true;
    } else {
      return false;
    }
  } else {
    alert('No ha seleccionado ningun registro.');
    return false;
  }
}


Saludos.
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2008-11-15 18:18
Gracias!! Este lunes intentare ponerme con ello y posteare dudas e
impresiones,

Un saludo
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2008-11-18 17:49
Hola, basicamente lo que tengo es una matriz de una columna y de N
filas, mi idea es agregar un checkbox en el margen izquierdo para
permitir al usuario marcar los que quiera y posteriormente poder pasar
los seleccionados a formato xls mostrando sus distintos campos.

Permiteme que te haga unas preguntas sobre tu codigo:
>
> <% form_tag(resource_path, :onSubmit => 'return
> checkSelectedElements();')
> do %>
> ...

¿Esto va en la vista?¿Al principio andes de escribir el codigo de mi
tabla? ¿Que hace?  esta claro que retorna los elemntos seleccionados,
pero no entiendo que pinta el resource_path


> <% @tickets.each do |ticket| %>
>   <tr>
>     <td><%= check_box_tag 'ticket_ids[]', ticket.id, false, :class =>
> 'validate-one-required' %></td>
>     ....
>   </tr>
> ...
> <% end %>

Basicamente esto me va metiendo el id de los tickets en un vector para
almacenarlo

> Entonces en el controlador tendras disponible params[:ticket_ids] con
> todos
> los ids de los tickets que se han seleccionado, adicionalmente puedes
> verificar que se haya seleccionado al menos uno mediante javascript:

Uso will-paginate como paginador, asi que cada vez que cambio de pagina
los checkboxes se borran, existe alguna manera de conservar el valor de
params[:ticket_ids] para que pueda mantener el id de las paginas
pasadas??.

> function checkSelectedElements(){
>   selected = $$('.validate-one-required').any(function(e) {return
> e.checked
> == true;} );
>   if (selected) {
>     if (confirm('Seguro que deseas ... estos registros?')){
>       return true;
>     } else {
>       return false;
>     }
>   } else {
>     alert('No ha seleccionado ningun registro.');
>     return false;
>   }
> }
>
>

Perdon pero, nunca he usado javascript, donde deberia ubicar esta
funcion?
B7de309e2f3436b5b1c0b5c18dad089d?d=identicon&s=25 Carlos Belizón Ibañez (paliyoes)
on 2008-11-18 20:37
Jose vicente Ribera pellicer wrote:
>
> Perdon pero, nunca he usado javascript, donde deberia ubicar esta
> funcion?

En un archivo .js en el directorio public/scripts y cargarlo en la vista
correspondiente a la acción.
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2008-11-19 19:41
Carlos Belizón wrote:
> Jose vicente Ribera pellicer wrote:
>>
>> Perdon pero, nunca he usado javascript, donde deberia ubicar esta
>> funcion?
>
> En un archivo .js en el directorio public/scripts y cargarlo en la vista
> correspondiente a la acción.

Gracias ;)

Finalmente y tras no encontrar ninguna solucion lo que estoy haciendo es
algo parecido a un carrito de la compra, junto con cada ticket tengo un
boton de agregar a la excel, (estos trabajan con el metodo POST, se ve
que el checkbox trabaja con el GET y por eso se perdian los
seleccionados al pasar de pagina).


Ahora tengo una clase Cartticket:

class Cartticket
  attr_reader :items

  def initialize
    @items = []
  end

  def add_ticket(ticket)
    @items << ticket
  end


end

En el controlador del ticket he agregado los metodos:
def add_to_cartticket  ->Añade un ticket
def find_cartticket    -> resetea la lista de tickets cada vez que
generamos una nueva sesion


  def vaciar_cartticket

private

end

  def expotar
    @tickets=Cartticket.find(:all)
    headers['Contenet-type']="aplication/vnd.ms-excel"
    headers['Contenet-Disposition']='attachment; filename="report.xls"'
    headers['Cache-Control']=''
end






<h2>Tickets seleccionados </h2>
<ul>
<% for item in @cartticket.items %>
<li><%=h item.id %></li>
<% end %>
</ul>
<br/>
<%= button_to "Vaciar" , :action => :vaciar_cartticket %>
<br/>

<%= link_to 'Exportar a Excel', exportar_tickets_url %>
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2008-11-19 19:58
Perdon postee la respuesta antes de terminarla...

Finalmente y tras no encontrar ninguna solucion lo que estoy haciendo es
algo parecido a un carrito de la compra, junto con cada ticket tengo un
boton de agregar a la excel, (estos trabajan con el metodo POST, se ve
que el checkbox trabaja con el GET y por eso se perdian los
seleccionados al pasar de pagina).


Ahora tengo una clase Cartticket:

 class Cartticket
   attr_reader :items

   def initialize
     @items = []
   end

   def add_ticket(ticket)
     @items << ticket
   end


 end

En el controlador del ticket he agregado los metodos:
def add_to_cartticket  ->Añade un ticket
def find_cartticket    -> resetea la lista de tickets cada vez que
cerramos la sesion
def vaciar_cartticket  ->Igual que arriba pero sin tener que cerrar la
sesion


Y aqui el que creo que me produce el error:

def expotar
    @tickets=@cartticket.items.find(:all)
    headers['Contenet-type']="aplication/vnd.ms-excel"
    headers['Contenet-Disposition']='attachment; filename="report.xls"'
    headers['Cache-Control']=''
end


Por el mensaje de error que aparece parece, pues @tickets esta vacio:

You have a nil object when you didn't expect it!
The error occurred while evaluating nil.state_idl

Extracted source (around line #2):

1: <tr>
2:   <td> <%=ticket.state_idl%> </td>
3:   <td> <%=ticket.client_id%> </td>
4:   <td> <%=ticket.state_id%> </td>
5:


El fichero de rutas esta modificado tal que asi:
map.resources :tickets,  :collection => { :exportar=>:get,
           :auto_complete_for_ticket_province => :get,
           :auto_complete_for_ticket_city => :get,
           :auto_complete_for_ticket_zip => :get,
           :auto_complete_for_ticket_adquired_in => :get  }


Para permitir el render :partial, que queda en exportar.html.erb

<table border="1" id="doc">
  <tr>
    <td>hola</td>

    <td>adios</td>

    <td>dew</td>
  </tr>
  <%=render :partial=> "ticket", :collection=>@tickets %>
  </table>


 end



 Por otro lado esta es la vista de donde situo el enlace que me debe
lanzar la excel

 <h2>Tickets seleccionados </h2>
 <ul>
 <% for item in @cartticket.items %>
 <li><%=h item.id %></li>
 <% end %>
 </ul>
 <br/>
 <%= button_to "Vaciar" , :action => :vaciar_cartticket %>
 <br/>

 <%= link_to 'Exportar a Excel', exportar_tickets_url %>






Si has llegado hasta aqui, que menos que darte las gracias por leerme.
El problema es que no "recoge"
los tickets que tengo almacenados, por eso creo que en exportar esta
linea
esta mal: @tickets=@cartticket.items.find(:all).

Me hechais un cable porfi?


Un saludo
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2008-11-20 21:03
Bueno, de momento he creado una vista con una tabla que muestra los
tickets seleccionados. De momento me conformo con eso aunque para psarlo
a excel no tenga mas remedio que copy/paste
This topic is locked and can not be replied to.