2015-03-28 1 views
2

J'essaie de convertir des hashtags en liens à l'intérieur d'un micropost. J'ai implémenté une gemme appelée simple_hashtag qui semble fonctionner pour l'aspect de liaison de ceci. Cependant, la gem fonctionne en extrayant des hashtags de la poste et en les affichant dans leur propre boucle. Ainsi, par exemple, si mon Micropost était:Transformer les hashtags en liens, en rails

Today I went #snowboarding, it was #awesome 

Le code pour extraire les balises est fait comme une boucle, ce qui signifie qu'il doit être fait en dehors du contenu.

<p><%= micropost.content %></p> 
    <ul> 
     <% micropost.hashtags.each do |hashtag| %> 
      <li><%= link_to hashtag.name, hashtag_path(hashtag.name) %></li> 
     <% end %> 
    </ul> 

Cela laisse la vue fini la recherche comme:

Today I went #snowboarding, it was #awesome 
    - snowboarding 
    - awesome 

Est-il possible d'avoir le code d'analyse du contenu et de remplacer les hashtags les liens en place? Je me demande s'il existe un moyen de collecter les hashtags, de les convertir en liens et de les remplacer dans le contenu?

Je sais que je peux analyser le contenu et trouver les hash en utilisant les éléments suivants:

<% content = micropost.content %> 
    <% hashes = content.scan(/#\w+/) %> 
    <% hashes.each do |hash| %> 
     <%= hash %> 
    <% end %> 

Je voudrais ensuite utiliser quelque chose comme hash.gsub! ou même Javascript, pour remplacer les hashtags dans le contenu des liens plutôt que les avoir énumérés ci-dessous.

Répondre

4

Vous pouvez utiliser un assistant pour cela avec quelque chose comme:

<%= render_with_hashtags(micropost.content) %> 

à votre avis, et le code comme ceci:

class MicropostHelper 
    def render_with_hashtags(content) 
    content_words = content.split(" ") 
    content_with_links = content_words.map do |word| 
     if word.contains?("#") 
     link_to hashtag.name, hashtag_path(hashtag.name) 
     else 
     word 
     end 
    end 

    content_with_links.join(" ") 
    end 
end 

, nous itérer sur chaque mot dans le contenu, en remplaçant les hashtags par des liens pour laisser le reste "tel quel".

+1

C'était super utile! J'ai dû utiliser .html_safe sur le rendu, car il ne faisait que montrer le html brut. J'ai aussi dû link_to mot au lieu du hashtag.name, et cela signifiait enlever le # avant qu'il ne crée le lien avec> word = word.tr ('#', '') - Mais ça fonctionne comme un charme maintenant! Merci beaucoup pour votre aide Martin – abbott567

+0

Heureux que c'était utile. D'accord, mon code était un peu trop "pseudo code", surtout en ce qui concerne les tags. Bonne capture avec la partie "raw/html_safe", aurait dû l'ajouter. Codage heureux! – Martin

7

je le ferais en utilisant regex, au lieu de se joindre à la division et le texte

def render_with_hashtags(text) 
    text.gsub(/(?:#(\w+))/) {hashtag_link($1)} 
end 
def hashtag_link(hash) 
    link_to "##{hash}", hashtag_path(hash) 
end 

Vous pouvez ajouter html_safe dans la méthode si vous voulez.

+0

Merci, je vais essayer de cela aussi, y a-t-il des avantages à utiliser regex? – abbott567

+0

Je pense que ce serait plus rapide (et plus petit) mais vous pourriez le comparer si vous voulez vérifier si c'est le cas ou non. –