2016-06-22 1 views
1

Im essayant de mettre en application des liens sociaux à mon application de rails mais im commençant à réaliser son va être un peu répétitif. Je veux que l'icône appropriée apparaisse si un lien est fourni par l'utilisateur.Code DRY pour les icônes sociales

Voici ce que j'ai jusqu'ici.

<% unless @user.github == nil %> 
    <%= link_to @user.github , class: 'btn btn-social-social btn-github' do %> 
    <span class="fa fa-github"></span> 
    <% end %> 
<% end %> 

Ici l'icône GitHub apparaîtra seulement si son github pas nul. Comment puis-je faire cela à plusieurs liens et en même temps garder mon code DRY?

Répondre

2

Vous pouvez définir une aide pour que:

def social_icon_helper(user, service) 
    if user.respond_to?(service) && !user.send(service).nil? 
    link_to user.send(service), class: "btn btn-social-social btn-#{service}" do 
     content_tag(:span, class: "fa fa-#{service}") 
    end 
    end 
end 

Alors à votre avis:

<p> 
    <%= social_icon_helper(@user, :github) %> 
</p> 

ou même

<% %i(github facebook twitter).each do |service| %> 
    <%= social_icon_helper(@user, service) %> 
<% end %> 

MISE À JOUR

Désolé, veuillez trouver le code d'assistance mis à jour. Veuillez noter que j'ai ajouté une " #{service}" après la définition du tag.

def social_icon_helper(user, service) 
    if user.respond_to?(service) && !user.send(service).nil? 
    link_to user.send(service), class: "btn btn-social-social btn-#{service}" do 
     content_tag(:span, " #{service}", class: "fa fa-#{service}") 
    end 
    end 
end 

Cette aide produit le lien suivant pour moi:

github link

+0

Merci d'avoir un problème cependant. l'assistant finit par afficher ' {: class = > " fa fa-github "}' –

1

Vous aurez seulement quelques-unes d'entre elles, non? ~ 5 ou plus? Dans ce cas, je ne m'embêterais pas trop à garder le code DRY. Le code des différents liens est assez différent pour ne pas en valoir la peine (différentes propriétés de l'objet, classes css, etc.)

Vous avez montré un seul cas (github), mais je peux facilement imaginer que dans certains cas le la propriété et la classe css ne correspondent pas (par exemple, user.google_plus et fa-gplus, ou quelque chose)

répéter le code 5 fois et le cacher dans une partie.

Si vous insistez, alors la réponse de @ retgoat devrait l'être.