2016-11-11 2 views
1

기본적으로 여기서 내가하는 일은 ratings의 4 가지 유형을 추적하는 것입니다. 등급이있는 경우 해당 등급에 다른 CSS 클래스를 적용한 다음 해당 행에 렌더링 된 다른 범위에 기본 CSS 클래스를 적용하고 싶습니다.이것을 어떻게 훨씬 더 건조하게 리팩터링합니까?

ratings = ["speed", "tackling", "passing", "dribbling"] 
ratings.each do |rating| 
    content_tag :div, class: "col-lg-3" do 
    if rating_param.eql? rating 
     if rating.eql? "speed" 
     content_tag :span, class: "label label-success label-lg" do 
      "#{rating.capitalize}: #{profile.ratings.find_by(user: current_user)[rating]}" 
     end 
     elsif rating.eql? "tackling" 
     content_tag :span, class: "label label-tackling label-lg" do 
      "#{rating.capitalize}: #{profile.ratings.find_by(user: current_user)[rating]}" 
     end 
     end 
    else 
     content_tag :span, class: "label label-default" do 
     "#{rating.capitalize}: #{profile.ratings.find_by(user: current_user)[rating]}" 
     end 
    end 
    end 
end 

그래서 기본적으로 내가 무엇을해야하는지 클래스에 rating지도입니다.

예를 들어, 다음과 같이 보일 수 있습니다 :

speed: success, tackling: info, dribbling: primary, passing: warning합니다.

등급이 speed 인 경우 success 등을 적용해야합니다.

어떻게 이것을 리팩토링하여 못생긴 무리가되지 않습니까? if 이러한 문구는 무엇입니까?

+0

클래스 값을 변수로 만들고이를 하나의'content_tag' 호출에 전달하십시오. –

+0

@DaveNewton이 더 완벽한 예를 보여 드려도 될까요? – marcamillion

+0

'content_tag'은 레일스 메소드라고 생각합니다. 레일 태그를 추가해야합니다. –

답변

2

(아니 완벽한 대답하지만, 주석에 쓸모.) (매우)

약 :

rating_classes = { 
    'speed'  => 'label-success label-lg', 
    'tackling' => 'label-tackling label-lg', 
    'passing' => 'whatever', 
    'dribbling' => 'whatever' 
} 

rating_class = rating_classes[rating_param] || 'label-default' 

content_tag :div, class: "col-lg-3" do 
    content_tag :span, class: "label #{rating_class}" do 
    "#{rating.capitalize}: #{profile.ratings.find_by(user: current_user)[rating]}" 
    end 
end 
+0

또는'rating_classes'를'Hash.new ('label-default'). merge (...)'로 정의하십시오. 여기서'merge'는 나머지 키/값 쌍을 포함합니다. 그럼'|| 'label-default'는 필요하지 않습니다. –

0

또한

rating_classes = { 
    "speed"  => "label label-success label-lg", 
    "tackling" => "label label-tackling label-lg", 
    "passing" => "label label-default", 
    "dribbling" => "label label-default" 
} 

profile_rating = profile.ratings.find_by(user: current_user) 

content_tag :div, class: "col-lg-3" do 
    rating_classes.each do |rating, klass| 
    content_tag :span, class: "#{klass}" do 
     "#{rating.capitalize}: #{profile_rating[rating]}" 
    end 
    end 
end 

..이 시도 할 수 있습니다 당신은 쓴 profile.ratings.find_by(user: current_user) 루프에서 동일한 쿼리를 4 번 실행하면 성능이 저하 될 수 있습니다.