ruby on rails - rails - Truncar cadena con rieles?
substring ruby (7)
Quiero truncar una cadena de la siguiente manera:
entrada:
string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
salida:
string = "abcd asfsa sadfsaf safsdaf aa...ddddd"
Truncar con omisión personalizada
De forma similar a lo que otros han sugerido aquí, puede usar el método truncate Rails y usar una omisión personalizada que en realidad es la última parte de su cadena:
string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
truncate(string, length: 37, omission: "...#{string[-5, 5]}")
# => "abcd asfsa sadfsaf safsdaf aa...ddddd"
Exactamente lo que querías
Puntos extra
Es posible que desee terminar esto en un método personalizado llamado algo como truncate_middle
que hace un trabajo de pies de lujo para usted:
# Truncate the given string but show the last five characters at the end.
#
def truncate_middle( string, options = {} )
options[:omission] = "...#{string[-5, 5]}" # Use last 5 chars of string.
truncate( string, options )
end
Y luego solo llámalo así:
string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
truncate_middle( string, length: 37 )
# => "abcd asfsa sadfsaf safsdaf aa...ddddd"
¡Auge!
Gracias por preguntar sobre esto Creo que es una forma útil de mostrar un fragmento de un texto más largo.
Echa un vistazo a truncate , en parte quiere que quieras. Si prueba si se truncó o no, podría agregar parte de la última parte después de la parte truncada.
truncate("Once upon a time in a world far far away")
# => "Once upon a time in a world..."
truncate("Once upon a time in a world far far away", :length => 17)
# => "Once upon a ti..."
truncate("Once upon a time in a world far far away", :length => 17, :separator => '' '')
# => "Once upon a..."
truncate("And they found that many people were sleeping better.", :length => 25, :omission => ''... (continued)'')
# => "And they f... (continued)"
En el caso más simple:
string = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
tr_string = string[0, 20] + "..." + string[-5,5]
o
def trancate(string, length = 20)
string.size > length+5 ? [string[0,length],string[-5,5]].join("...") : string
end
# Usage
trancate "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd"
#=> "abcd asfsa sadfsaf s...ddddd"
trancate "Hello Beautiful World"
#=> "Hello Beautiful World"
trancate "Hello Beautiful World", 5
#=> "Hello...World"
Eso es en realidad un problema interesante y es posible que desee resolverlo usando javascript en lugar de ruby. Esta es la razón por la que probablemente esté mostrando este texto en la pantalla en alguna parte, y solo tiene una cierta cantidad de ancho disponible. Entonces, en lugar de tener tu enlace (o cualquier texto) reducido a una cantidad de caracteres, lo que realmente quieres es asegurarte de que el texto que estás mostrando nunca exceda cierto ancho. El número de caracteres que pueden caber en un determinado ancho depende de la fuente, el espaciado, etc. (los estilos CSS) que está usando. Puedes asegurarte de que todo está bien si estás usando una solución basada en rubíes, pero puede que todo falle si decides cambiar tu estilo más adelante.
Por lo tanto, recomiendo una solución basada en JavaScript. La forma en que lo he manejado anteriormente ha sido usar el plugin jquery truncate . Incluye el complemento en tu aplicación. Y luego enganche un javascript similar al siguiente cada vez que se carga la página:
function truncateLongText() {
$(''.my_style1'').truncate({
width: 270,
addtitle: true
});
$(''.my_style2'').truncate({
width: 100
});
}
Agregue lo que otros estilos deben ser truncables y el ancho que deben respetar, el complemento hace el resto. Esto tiene la ventaja adicional de tener toda tu lógica de truncamiento para toda la aplicación en un solo lugar que puede ser útil.
Este es el código fuente de String#truncate
def truncate(truncate_at, options = {})
return dup unless length > truncate_at
options[:omission] ||= ''...''
length_with_room_for_omission = truncate_at - options[:omission].length
stop = /
if options[:separator]
rindex(options[:separator], length_with_room_for_omission) || length_with_room_for_omission
else
length_with_room_for_omission
end
"#{self[0...stop]}#{options[:omission]}"
end
Entonces, en cuanto a tu caso
string.truncate(37, :omission => "...ddddd")
Puede que esta no sea la solución exacta para su problema, pero creo que lo ayudará a orientarse en la dirección correcta, con una manera bastante limpia de hacer las cosas.
Si quieres "¡Hola Mundo!" para estar limitado a las primeras cinco letras, puedes hacer:
str = "Hello, World!"
str[0...5] # => "Hello"
Si quieres una elipsis, simplemente interpolala:
"#{str[0...5]}..." #=> "Hello..."
Puedes hacer casi lo mismo sin Rails:
text.gsub(/^(.{50,}?).*$/m,''/1...'')
50
es la longitud que necesitas.