2010-04-13 3 views
29

Je montre des commentaires récents sur la page d'accueil d'une application de blog très simple que je construis dans Ruby on Rails. Je souhaite limiter le nombre de caractères affichés à partir de la colonne "body" de la table des commentaires. Je suppose que je peux juste ajouter quelque chose à la fin du code pour <% = h comment.body%> mais je ne sais pas ce que ce serait encore car je suis nouveau à la fois Ruby et Rails.Limitation de caractères/mots en vue - ruby ​​on rails

Voici le code que j'ai dans le fichier /views/posts/index.html.erb:

<% Comment.find(:all, :order => 'created_at DESC', :limit => 5).each do |comment| -%> 
    <p> 
     <%=h comment.name %> commented on 
     <%= link_to h(comment.post.title), comment.post %><br/> 
     <%=h comment.body %> 
     <i> <%= time_ago_in_words(comment.created_at) %> ago</i> 
    </p> 
    <% end -%> 

Répondre

68

Essayez l'aide truncate vue

<%=h truncate(comment.body, :length => 80) %> 
+0

curiosité (non un utilisateur de Rails): cela fonctionnerait-il aussi? <% = h comment.body [0, 80] + "..."%> – steenslag

+0

C'est à peu près ce que truncate fait en dessous, mais il vérifie aussi la longueur pour savoir si ajouter "..." au fin – Corey

+0

Je voulais juste ajouter que truncate n'est pas multi-byte sûr (ruby 1.8, rails 2.3.5, pas sûr de ruby ​​1.9). Il tronque à l'octet spécifié et si vous avez une chaîne unicode, la sortie sera plus courte (moins de caractères que la longueur spécifiée). Vous pourriez aussi vous retrouver avec un personnage brisé à la fin. Bien sûr, il n'y a rien à craindre si vous utilisez ASCII ou tout autre encodage de caractères 8 bits. – Teoulas

24

Je viens de découvrir une autre façon (si vous ne voulez pas ajouter les "...")

<%= comment.body.first(80) %> 

Comme dit dans le RoR API for String:

première (limite = 1)

renvoie le premier caractère. Si une limite est fournie, renvoie une sous-chaîne depuis le début de la chaîne jusqu'à ce qu'elle atteigne la valeur limite. Si la limite donnée est supérieure ou égale à la longueur de la chaîne, renvoie self.

comment = "1234567890" 

comment.first(5) 
# => "12345" 

comment.first(10) 
# => "1234567890" 

comment.first(15) 
# => "1234567890" 
+0

J'adore ça. Merci. Cleaner et vous n'avez pas besoin d'inclure des aides à la vue Rails pour l'utiliser. –

+0

attachez .html_safe si les balises html sont également incluses dans le texte – ImranNaqvi

5

Si vous utilisez la méthode rails 4.2 ou au-dessus, vous pouvez alors utiliser truncate_words.

Par exemple:
"Dans un monde où tout est génial" .truncate_words (3)

Sortie: "Dans un monde ..."