2013-03-07 4 views
10

Ho un paragrafo che voglio troncare con l'opzione di fare clic su "leggi di più" e farlo aprire con il resto del contenuto. Il contenuto proviene da un campo di database. Ecco quello che ho per il troncato:Rails tronca con un commutatore "leggi altro"

<%= truncate(@major.glance, :length => 250, :omission => '... Read More')%> 

io non riesco a trovare un modo per fare questo con dati estratti da un database. Vedo molti esempi usando il testo completo con il testo che vuoi nascondere in un tag div separato. Ma poiché questo contenuto proviene da un database ed è dinamico, non riesco a trovare alcuna informazione su come farlo.

+0

Questa è stata una risposta semplice che ha funzionato per me. http://stackoverflow.com/a/26854494/5551783 – dgreen22

risposta

22

È possibile provare il seguente

<div> 
    <% if @major.glance.length > 250 %> 
    <%= link_to_function truncate(@major.glance, length: 250), "$(this).parent().html('#{escape_javascript @major.glance}')" %> 
    <% else %> 
    <%= @major.glance %> 
    <% end %> 
</div> 

o se si preferisce utilizzare la Read more collegamento

<div> 
    <% if @major.glance.length > 250 %> 
    <%= truncate(@major.glance, length: 250) %> 
    <%= link_to_function '...Read more', "$(this).parent().html('#{escape_javascript @major.glance}')" %> 
    <% else %> 
    <%= @major.glance %> 
    <% end %> 
<div> 

UPDATE

Dal momento in Rails 4, link_to_function è deprecato ed è si consiglia di avere js non ostruente, utilizzare il seguente

<div> 
    <% if @major.glance.length > 250 %> 
    <%= truncate(@major.glance, length: 250) %> 
    <%= link_to '...Read more', '', class: "read-more-#{@major.id}" %> 
    <script> 
     $('.read-more-<%= @major.id %>').on('click', function(e) { 
     e.preventDefault() 
     $(this).parent().html('<%= escape_javascript @major.glance %>') 
     }) 
    </script> 
    <% else %> 
    <%= @major.glance %> 
    <% end %> 
<div> 
+1

solo un seguito che il motivo per cui non è possibile utilizzare l'opzione "omissione" come collegamento è perché il metodo troncato include questo nel conteggio dei caratteri. Puoi usarlo ma devi aggiungere un po 'di logica nel calcolo del numero di caratteri che vuoi troncare. – jvnill

+0

è possibile modificare la parte js in modo che cambi nuovamente il contenuto del genitore. oppure aggiungi 2 div, uno con la parte troncata, l'altro con il non abbreviato, quindi attiva semplicemente il div. – jvnill

+0

cambia solo questa parte '" $ (this) .parent(). Html ('# {escape_javascript @ major.glance}') "' per l'equivalente MooTools e sei impostato. – jvnill

5

So che mi sto unendo a questa conversazione un po 'tardi. Ho affrontato lo stesso problema, provando la soluzione sopra, che funziona bene. Tuttavia, il contenuto saggio di SEO che è stato nascosto non è stato indicizzato dai motori di ricerca. Ho controllato anche Lynx e il collegamento non può essere seguito (ovviamente). Così deciso per questa soluzione da Jed Foster | readmore.js - lince può leggerlo correttamente e ora sto aspettando l'aggiornamento dell'indice SE e vedere se riesco a trovarmi nei risultati di ricerca. Nel caso in cui qualcuno si trovi in ​​una situazione simile ...

+0

Grazie per avermi fatto conoscere readmore.js questo è esattamente il tipo di cosa che stavo cercando di fare. Questo sembra fantastico. Grazie per la condivisione! – lflores