2011-02-17 14 views
10

Descripción bastante larga que quiero truncar usando truncar helper. Así que estoy usando el:Rieles truncar ayudante con enlace como omit texto

truncate article.description, :length => 200, :omission => ' ...' 

El problema es que quiero utilizar más como un enlace activo así que en teoría podía usar esto:

truncate article.description, :length => 200, :omission => "... #{link_to('[more]', articles_path(article)}" 

texto omisión se maneja como inseguro por lo se escapó Traté de hacerlo html_safe pero no funcionó, en lugar de link [más], mi navegador sigue mostrando el html para ese enlace.

¿Hay alguna manera de obligar a truncar a imprimir el enlace de omisión en lugar de omitir el texto?

+1

posible duplicado de [Hacer omisión en ruby ​​truncar un enlace] (http: // stackoverflow.com/questions/4964073/make-omission-en-ruby-truncate-a-link) –

Respuesta

10

Yo sugeriría hacer esto por su cuenta en un método de ayuda, de esa manera usted tendrá un poco más de control sobre la salida así:

def article_description article 
    output = h truncate(article.description, length: 200, omission: '...') 
    output += link_to('[more]', article_path(article)) if article.description.size > 200 
    output.html_safe 
end 
+0

@ Pam-Thomakos Esto funciona de maravilla excepto por un problema. Cuando hago clic en el enlace, va a las publicaciones.1 en lugar de a la publicación/1. –

+0

Debe ser singular 'article_path' en lugar del plural' articles_path' – Patrick

+0

¿Qué hace la 'h' antes de truncar? – Patrick

7

solución sucia ... utilizar el método de "prima "para desenterrarlo".
tiene que estar seguro de la "cordura" de su contenido.

raw(truncate article.description, :length => 200, :omission => "... #{link_to('[more]', articles_path(article)}") 

raw es un helper que actúa como html_safe.
bye

editar: no es la omisión de ser escapado, sino el resultado del método truncado.

+1

El problema es que no puedo estar seguro de la cordura del artículo.description –

4

Me encontré con una situación similar y esto hizo el truco. Trate (saltos de línea para facilitar la lectura):

(truncate h(article.description), 
        :length => 200, 
        :omission => "... #{link_to('[more]',articles_path(article)}") 
        .html_safe 

Puede utilizar h para asegurar la cordura de la descripción del artículo, y dado que se está ajustando el link_to a un camino que saber para que no sea algo potencialmente nefasto, puede marcar la resultante cadena como html_safe sin preocupación.

+0

Deberás tener cuidado de pasar 'escape: false', al menos a partir de Rails 4.0.1, ya que [' TextHelper # truncate' agregar su propio escape] (https://github.com/rails/rails/blob/58ab79ff9b34c22c3477e29763fdd4f4612e938d/actionpack/lib/action_view/helpers/text_helper.rb#L92) a la concatenación de 'h (article.description)' y el 'omisión 'texto. Ninguna cantidad de '.html_safe' lo evitará. –

2

TextHelper#truncate tiene un block form of truncate, que le permite utilizar un link_to que no se escapó, sin dejar escapar el texto truncado:

truncate("<script>alert('hello world')</script>") { link_to "Read More", "#" } 

#=> &lt;script&gt;alert(&#39;hello world&#39;...<a href="#">Read More</a> 
1

El único que trabajó para mí:

<%= truncate(@article.content, length: 200, omission: " ... %s") % link_to('read more', article_path(@article)) %> 
10

Con Rails 4, puede/debe pasar en un bloque para el enlace:

truncate("Once upon a time in a world far far away", 
    length: 10, 
    separator: ' ', 
    omission: '... ') {  
    link_to "Read more", "#" 
} 
+0

Trabajos. Gracias .. – Abram

+0

Esto es lo que hizo por mí. ¡Gracias! – iamse7en

1

Tuve el mismo problema, en mi caso acabo de usar :escape => false. Eso trabajado:

truncate article.description, :length => 200, :omission => "... #{link_to('[more]', articles_path(article)}", :escape => false

De la documentación:

El resultado está marcado como HTML-seguro, pero se escapó por defecto, a menos que: escape es falsa .... enlace: http://apidock.com/rails/ActionView/Helpers/TextHelper/truncate

Cuestiones relacionadas