2016-06-22 4 views
1

나는 내 레일 앱에 대한 소셜 링크를 구현하려고하지만 조금 반복적으로 진행되는 것을 알기 시작합니다. 사용자가 링크를 제공하면 해당 아이콘이 나타나기를 원합니다.소셜 아이콘을위한 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이 아니 전무가 표시됩니다. 어떻게하면 여러 링크에 동시에 코드 드라이를 유지할 수 있습니까?

당신은 그것을위한 도우미 정의 할 수

답변

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}"을 추가했습니다.

github link

+0

그래도 문제가 하나 있습니다. 헬퍼가' {: class = > " fa fa-github "}' –

1

당신은, 바로 그 중 몇 가지를해야합니다 : 도우미 나를 위해 다음 링크를 생산하고

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 

? ~ 5 정도입니까? 이 경우 DRY 코드를 유지하는 데 너무 많은 신경을 쓰지 않을 것입니다. 다른 링크에 대한 코드는 노력의 가치가 없도록 충분히 다릅니다 (다른 객체 속성, CSS 클래스 등)

하나의 사례 (github) 만 표시했지만 일부 경우에는 속성 및 CSS 클래스가 일치하지 않습니다 (예 : user.google_plusfa-gplus 또는 그 외)

코드를 5 회 반복하고 부분적으로 숨 깁니다.

당신이 주장하는 경우, @ retgoat의 대답은해야합니다.