2016-06-22 3 views
1

Im пытается реализовать социальные ссылки на мое приложение rails, но im начинает понимать, что это будет немного повторяться. Я хочу, чтобы соответствующий значок появлялся, если ссылка предоставлена ​​пользователем.Код DRY для социальных значков

Вот что у меня есть.

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

Здесь значок Github будет отображаться только если github его не ноль. Как я могу сделать это по нескольким ссылкам и в то же время сохранить свой код DRY?

ответ

2

Вы можете определить помощника для этого:

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 

Затем на ваш взгляд:

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

или даже

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

UPDATE

Извините, пожалуйста, найдите обновленный вспомогательный код. Обратите внимание, что после определения тега я добавил " #{service}".

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 

Этот помощник производит следующую ссылку для меня:

github link

+0

Спасибо, что у меня есть одна проблема. помощник заканчивается показом ' {: class = > " fa fa-github "}' –

1

Вы только несколько из них, не так ли? ~ 5 или около того? В этом случае я не стал бы слишком беспокоиться о сохранении кода DRY. Код для разных ссылок достаточно различен, чтобы сделать его нецелесообразным (разные свойства объекта, классы css и т. Д.)

Вы показали только один случай (github), но я легко могу представить, что в некоторых случаях свойство и класс css не будут соответствовать (например, user.google_plus и fa-gplus, или что-то еще)

Просто повторите код 5 раз и спрячьте его в частичном.

Если вы настаиваете, то ответ @ retgoat должен сделать.