Forum: Rails-ES Limitar resultados

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.
E082daed703e23ebbe7f04a500101eed?d=identicon&s=25 Fernando Seves (Guest)
on 2007-07-27 13:21
(Received via mailing list)
Buenas

Tengo esta instrucción que crea un loop y pinta tantos checkbox (u
opciones)
como tengo en la base de datos. Es decir si tengo 20 pinta 20 checkbox,
si
5, pinta 5. El caso es que yo quiero limitar a 5 los checkbox que se
muestren (tengo actualmente unos 20) y luego si el usuario quiere ver
mas,
enseñar el resto con un enlace tipo "mas" (que desplegaría con jquery).
Alguien tiene idea de como limitar este resultado?

 <% for characteristic in @characteristics %>
    <ul class="Checkboxes">
      <li>
        <input class="checkbox" id="<%=characteristic.id%>"
name="characteristic_ids[]" value="<%=characteristic.id%>"
type="checkbox"/>
        <%=characteristic.name%></li>
    </ul>
    <% end %>
    </div>
    <% end %>

Un saludo a la lista y muchas gracias
E91518f050cb6081186ff461950099e0?d=identicon&s=25 Luis Villegas (vilec)
on 2007-07-27 13:45
(Received via mailing list)
Puedes hacerlo del lado del servidor, poniendo :limit => 5 en tu
sentencia
find en el controlador y luego, al pulsar el más sin el :limit, o del
lado
de cliente así:

<style>
    .li_oculto{
        display:none;
    }
</style>
 <% @characteristics.each_with_index do |characteristic, i| %>
    <ul class="Checkboxes">
      <li class="<%='li_oculto' if i>4   %>" >
        <input  class="checkbox" id="<%=characteristic.id%>"
name="characteristic_ids[]" value="<%= characteristic.id%>"
type="checkbox"/>
        <%=characteristic.name%>
     </li>
    </ul>
<% end %>
<input type="button" value ='ver todos'
onclick="mostrar();this.style.display='none'">
<script>
    function mostrar(){
        a = document.getElementsByClassName('li_oculto')
        for (i=0;i<a.length;i++){a[i].style.display="block"}
    }
</script>
E082daed703e23ebbe7f04a500101eed?d=identicon&s=25 Fernando Seves (Guest)
on 2007-07-27 14:59
(Received via mailing list)
Hola Luis ,

Muchas gracias por tu respuesta.

He limitado el numero de resultados en el controlador a 5 y ahora solo
se
muestarn los 5 pero el javascript no funciona.
Entiendo que la logica de lo que propones es esta: si el contador es > 4
usa
la clase ocultar para el resto de los checkbox correcto? Con el
javascript
le quitas la clase ocultar y se ven todos... No obstante y en caso de q
funcionara el boton de "ver mas" este se sigue quedando al final de la
lista.

Se me ocurre esta solucion un poco chapuzera (no soy programador)

En el controlador
 @characteristics = Characteristic.find(:all, :order => "name")
creo uno nuevo limitado a 5
@characteristics2 = Characteristic.find(:all, :order => "name", :limit
=> 5
)

y con jquery al pulsar en ver mas oculto el div q tiene la llamada al
charactericts2 (el q muestra solo 5)  y muestro el characteristics (que
tiene todos)

q te parece?


El día 27/07/07, Luis Villegas <luis.vilec@gmail.com> escribió:
E91518f050cb6081186ff461950099e0?d=identicon&s=25 Luis Villegas (vilec)
on 2007-07-27 21:42
(Received via mailing list)
Creo que no me has entendido. Te decía que puedes limitar a 5 en el
controlador y pasarle un parámetro que sea mostrar_mas = true una vez
que
pinches en el botón de ver más.

Esa era una opción. La otra es la que te he puesto. Le pasas toda la
consulta a la página y la muestras como te he dicho.

Si lo has limitado, el botón no va a funcionar porque javascript no
llama al
servidor en esa funcioncilla que te he pasado.

>
>
> Entiendo que la logica de lo que propones es esta: si el contador es > 4
> usa la clase ocultar para el resto de los checkbox correcto? Con el
> javascript le quitas la clase ocultar y se ven todos... No obstante y en
> caso de q funcionara el boton de "ver mas" este se sigue quedando al final
> de la lista.


Eso hace la lógica del código que te pasé. Luego al pulsar el botón ver
todos, se mostrarían todos y se ocultaría el botón con
this.style.display='none'. Para asegurarte de que se esconda el botón
haz:

<input type="button" value ='ver todos' onclick="mostrar(this)">
<script>
    function mostrar(boton){
        boton.style.display='none';
        a = document.getElementsByClassName('li_oculto');
        for (i=0;i<a.length;i++){a[i].style.display="block"}
    }
</script>



Se me ocurre esta solucion un poco chapuzera (no soy programador)
>
> q te parece?



Se puede hacer mucho más fácil, que es la manera que te decía del lado
del
servidor.

Que el método sea:

def el_metodo

  @characteristics = Characteristic.find(:all, :order => "name", :limit
=>
limite )
end

 <% for characteristic in @characteristics %>
    <ul class="Checkboxes">
      <li>
        <input class="checkbox" id="<%=characteristic.id%>"
name="characteristic_ids[]" value="<%= characteristic.id%>"
type="checkbox"/>
        <%=characteristic.name%></li>
    </ul>
    <% end %>
    </div>
    <% end %>


El día 27/07/07, Luis Villegas <luis.vilec@gmail.com> escribió:
E91518f050cb6081186ff461950099e0?d=identicon&s=25 Luis Villegas (vilec)
on 2007-07-27 21:51
(Received via mailing list)
Perdón, le dí a enviar. Éste es el correo bueno:


Creo que no me has entendido. Te decía que puedes limitar a 5 en el
controlador y pasarle un parámetro que sea mostrar_mas = true una vez
que
pinches en el botón de ver más.

Esa era una opción. La otra es la que te he puesto. Le pasas toda la
consulta a la página y la muestras como te he dicho.

Si lo has limitado, el botón no va a funcionar porque javascript no
llama al
servidor en esa funcioncilla que te he pasado.

>
>
> Entiendo que la logica de lo que propones es esta: si el contador es > 4
> usa la clase ocultar para el resto de los checkbox correcto? Con el
> javascript le quitas la clase ocultar y se ven todos... No obstante y en
> caso de q funcionara el boton de "ver mas" este se sigue quedando al final
> de la lista.


Eso hace la lógica del código que te pasé. Luego al pulsar el botón ver
todos, se mostrarían todos y se ocultaría el botón con
this.style.display='none'. Para asegurarte de que se esconda el botón
haz:

<input type="button" value ='ver todos' onclick="mostrar(this)">
<script>
    function mostrar(boton){
        boton.style.display='none';
        a = document.getElementsByClassName('li_oculto');
        for (i=0;i<a.length;i++){a[i].style.display="block"}
    }
</script>



Se me ocurre esta solucion un poco chapuzera (no soy programador)
>
> q te parece?



Se puede hacer mucho más fácil, que es la manera que te decía del lado
del
servidor.

Que el método sea:

def el_metodo
   #Si no se le pasa ningún parámetro(primera vez que accedes al
método),
entrará en el "else", si se le pasa, pondrá una variable en el request
para
controlar que se muestre o no el enlace "ver todos"
   if params[:mostrar_mas]
     @se_muestra_el_enlace = false
  else
    limite = 5
     @se_muestra_el_enlace = true
 end
  @characteristics = Characteristic.find(:all, :order => "name", :limit
=>
limite )

   render :partial => 'mi_metodo'
end


Y en la vista, guárdala como _mi_metodo.rhtml


 <% for characteristic in @characteristics %>
    <ul class="Checkboxes">
      <li>
        <input class="checkbox" id="<%=characteristic.id%>"
name="characteristic_ids[]" value="<%= characteristic.id%>"
type="checkbox"/>
        <%=characteristic.name%></li>
    </ul>
    <% end %>
    </div>
    <% end %>
<%if se_muestra_el_enlace%>
<%=link_to_remote "ver todos", :url => { :action => "el_metodo",
:mostrar_mas => true} %>
<%end%>

A ver si te vale esto. Un saludo

Ese link_to_remote crea una función ajax que llamará a tu método en el
servidor, pero esta vez pasándole un parámetro: mostrar_mas.
Bf9f0e58242907898e40377c013cddf9?d=identicon&s=25 Aldo A. Villagra B. (Guest)
on 2007-07-27 23:12
(Received via mailing list)
Creo que esto es lo que buscas

http://errtheblog.com/post/929

Saludos.

On Friday 27 July 2007 13:50:36 Luis Villegas wrote:
> Si lo has limitado, el botón no va a funcionar porque javascript no llama
> this.style.display='none'. Para asegurarte de que se esconda el botón haz:
>
> > charactericts2 (el q muestra solo 5)  y muestro el characteristics (que
>    #Si no se le pasa ningún parámetro(primera vez que accedes al método),
>
>         <input class="checkbox" id="<%=characteristic.id%>"
> :mostrar_mas => true} %>
> > controlador y pasarle un parámetro que sea mostrar_mas = true una vez que
> > > javascript le quitas la clase ocultar y se ven todos... No obstante y
> > <script>
> >
> > > q te parece?
> > end
> >     </div>
> > > >     }
> > > > <% end %>
> > > > > Buenas
> > > > >     <ul class="Checkboxes">
> > > > > Un saludo a la lista y muchas gracias
> > > > Ror-es mailing list
> > > Ror-es@lists.simplelogica.net
> > > http://lists.simplelogica.net/mailman/listinfo/ror-es



--
--
Aldo Villagra
                ..--""|
                |     |
                | .---'
          (\-.--| |---------.
         / \) \ | |          \
         |:.  | | |           |
         |:.  | |o|           |
         |:.  | `"`           |
         |:.  |_ __  __ _  __ /
         `""""`""|=`|"""""""`
                 |=_|
             jgs |= |
E082daed703e23ebbe7f04a500101eed?d=identicon&s=25 Fernando Seves (Guest)
on 2007-07-27 23:43
(Received via mailing list)
Muchas gracias Luis,

A final te cuento como lo he hecho (disculpa la chapuza)

Sin tocar el controlador he adaptado tu codigo con JQuey

<div class="more">
 <% @characteristics.each_with_index do |characteristic, i| %>
    <ul class="Checkboxes">
      <li class="<%='li_oculto' if i>8   %>" >
        <input  class="checkbox" id="<%=characteristic.id%>"
name="characteristic_ids[]" value="<%= characteristic.id%>"
type="checkbox"/>
        <%= characteristic.name%>
     </li>
    </ul>
<% end %>
    </div>    <h3 class="more_options"><a href="#">Add categories to
your
search</a></h3>

El codigo de Jquery

<script type="text/javascript">
 $(document).ready(function(){
   $(".more_options").toggle(function(){
$("li.li_oculto").addClass("li_visible");$("div.more").addClass("more2");
   },function(){
$("li.li_visible").removeClass("li_visible");$("div.more2
").removeClass("more2").addClass("more");
   });
 });
</script>

He añadido un div porque al quitar la visibilidad del los checkboxes  el
div
donde estaba no modificaba la altura y seguia tan "alto" como cuando
pintaba
los 20 checkboxes.

un saludo cordial y muy muy agradecido por tu ayuda.

Fernando
El día 27/07/07, Luis Villegas <luis.vilec@gmail.com> escribió:
This topic is locked and can not be replied to.