Tronquer une chaîne avec Rails?

Je veux tronquer une chaîne comme suit:

consortingbution:

ssortingng = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd" 

sortie:

 ssortingng = "abcd asfsa sadfsaf safsdaf aa...ddddd" 

    Jetez un coup d’oeil à tronquer , il veut partiellement que vous voulez. Si vous testez si elle a été ponctuée ou non, vous pouvez append une partie de la dernière partie après la partie tronquée.

     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)" 

    Dans le cas le plus simple:

     ssortingng = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd" tr_ssortingng = ssortingng[0, 20] + "..." + ssortingng[-5,5] 

    ou

     def trancate(ssortingng, length = 20) ssortingng.size > length+5 ? [ssortingng[0,length],ssortingng[-5,5]].join("...") : ssortingng 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" 

    Vous pouvez faire presque la même chose sans Rails:

     text.gsub(/^(.{50,}?).*$/m,'\1...') 

    50 est la longueur dont vous avez besoin.

    Ce n’est peut-être pas la solution exacte à votre problème, mais je pense que cela vous aidera à aller dans la bonne direction, avec une façon de faire plutôt propre.

    Si vous voulez “Bonjour, Monde!” être limité aux cinq premières lettres, vous pouvez faire:

     str = "Hello, World!" str[0...5] # => "Hello" 

    Si vous voulez une ellipse, il suffit de l’interpoler:

     "#{str[0...5]}..." #=> "Hello..." 

    Tronquer avec l’omission personnalisée

    Semblable à ce que d’autres ont suggéré ici, vous pouvez utiliser la méthode #truncate de Rails et utiliser une omission personnalisée qui constitue en fait la dernière partie de votre chaîne:

     ssortingng = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd" truncate(ssortingng, length: 37, omission: "...#{ssortingng[-5, 5]}") # => "abcd asfsa sadfsaf safsdaf aa...ddddd" 

    Exactement ce que tu voulais

    Points bonus

    Vous voudrez peut-être en finir avec une méthode personnalisée appelée truncate_middle qui vous fera du bien:

     # Truncate the given ssortingng but show the last five characters at the end. # def truncate_middle( ssortingng, options = {} ) options[:omission] = "...#{ssortingng[-5, 5]}" # Use last 5 chars of ssortingng. truncate( ssortingng, options ) end 

    Et puis appelez comme ça:

     ssortingng = "abcd asfsa sadfsaf safsdaf aaaaaaaaaa aaaaaaaaaa dddddddddddddd" truncate_middle( ssortingng, length: 37 ) # => "abcd asfsa sadfsaf safsdaf aa...ddddd" 

    Boom!

    Merci d’avoir posé des questions à ce sujet. Je pense que c’est un moyen utile de montrer un extrait d’un texte plus long.

    Ceci est le code source de Ssortingng#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 

    Donc, comme pour vous

     ssortingng.truncate(37, :omission => "...ddddd") 

    C’est en fait un problème intéressant et vous voudrez peut-être le résoudre en utilisant javascript plutôt que ruby. Voici pourquoi, vous affichez probablement ce texte à l’écran quelque part, et vous ne disposez que d’une certaine largeur. Donc, plutôt que d’avoir un lien (ou un texte quelconque) réduit à un certain nombre de caractères, ce que vous voulez vraiment, c’est vous assurer que le texte que vous affichez ne dépasse jamais une certaine largeur. Le nombre de caractères pouvant tenir dans une certaine largeur dépend de la police, de l’espacement, etc. (les styles css) que vous utilisez. Vous pouvez vous assurer que tout va bien si vous utilisez une solution basée sur Ruby, mais tout pourrait être différent si vous décidez de changer votre style ultérieurement.

    Je recommande donc une solution basée sur javascript. La façon dont je l’ai géré précédemment était d’utiliser le plugin jquery truncate . Inclure le plugin dans votre application. Et puis attachez du javascript similaire au suivant chaque fois que la page se charge:

     function truncateLongText() { $('.my_style1').truncate({ width: 270, addtitle: true }); $('.my_style2').truncate({ width: 100 }); } 

    Ajoutez les autres styles qui doivent être tronqués et la largeur à respecter, le plugin fait le rest. Cela présente l’avantage supplémentaire d’avoir toute votre logique de troncature pour l’ensemble de l’application en un seul endroit, ce qui peut être pratique.