2016-11-11 11 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'はRailsのメソッドだと思うので、Railのタグを追加する必要があります。 –

答えて

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 

あなたが書かれています同じクエリを4回実行するループ内のprofile.ratings.find_by(user: current_user)は、パフォーマンスを低下させる可能性があります。

関連する問題