0

重いif文をリファクタリングする効率的な方法は何ですか?Ruby on Railsで重いif文をリファクタリングする効率的な方法は何ですか?

すべての提案が奨励されています...

<% if @user.plan_id == 1 %> 
     <span class="label label-info">Plan1</span> 
    <% elsif @user.plan_id == 2 %> 
     <span class="label label-warning">Plan2</span> 
    <% elsif @user.plan_id == 3 %> 
     <span class="label label-info">Plan3</span> 
    <% elsif @user.plan_id == 4 %> 
     <span class="label label-warning">Plan4</span> 
    <% elsif @user.plan_id == 5 %> 
     <span class="label label-info">Plan5</span> 
    <% elsif @user.plan_id == 6 %> 
     <span class="label label-warning">Plan6</span> 
    <% elsif @user.plan_id == 7 %> 
     <span class="label label-info">Plan7</span> 
    <% elsif @user.plan_id == 8 %> 
     <span class="label label-warning">Plan8</span> 
<% end %> 
+2

使用[ケース](http://ruby-doc.org/docs/コントローラは、このような何かにあなたのコードを簡素化keywords/1.9/Object.html#method-i-case)のステートメントです。 –

+0

重複している可能性があります。http://stackoverflow.com/questions/35275608/ruby-refactoring-if-elation-statement –

+0

tryoveroverflow http://stackoverflow.com/search?q=%5Bruby-on-rails%5D+refactoring + if + else –

答えて

3

:あなたのビューで、その後

def plan_hash 
    { 
    1 => { :klass => "label-info", :description => "Plan1" }, 
    2 => { :klass => "label-warning", :description => "Plan2" }, 
    3 => { :klass => "label-info", :description => "Plan3" }, 
    4 => { :klass => "label-warning", :description => "Plan4" }, 
    5 => { :klass => "label-info", :description => "Plan5" }, 
    6 => { :klass => "label-warning", :description => "Plan6" }, 
    7 => { :klass => "label-info", :description => "Plan7" }, 
    8 => { :klass => "label-warning", :description => "Plan8" } 
    } 
end 

<span class="label label-<%= @user.plan.elite ? 'warning' : 'info' %>}"> 
    <%= @user.plan.label %> 
</span> 
+0

小さな質問: 'plan_details'メソッドに' yield'を追加する目的は何ですか? –

+0

@UtsavKesharwaniつまり、ローカル変数を作成するのではなく、ブロックを内部で 'plan_details(...)do'として構造化することができます。 – tadman

+0

Rubyではフレームワークレベルのコードの外で 'yield 'が奇妙に不十分であるようです。あるいは、私が見終わったコードだけかもしれません。 –

0

を使用できcase

<% case @user.plan_id %> 
<% when 1 %> 
    <span class="label label-info">CONTRIBUTOR</span> 
<% when 2 %> 
    <span class="label label-warning">ELITE CONTRIBUTOR</span> 
<% when 3 %> 
    <span class="label label-info">TECHNICIAN</span> 
<% when 4 %> 
    <span class="label label-warning">ELITE TECHNICIAN</span> 
<% when 5 %> 
    <span class="label label-info">CENTER</span> 
<% when 6 %> 
    <span class="label label-warning">ELITE CENTER</span> 
<% when 7 %> 
    <span class="label label-info">AFFAIR</span> 
<% when 8 %> 
     <span class="label label-warning">ELITE AFFAIR</span> 
<% end %> 
2

plan_id参照Planモデルしていますか?そうでない場合は、label属性とeliteフラグを使用して作成することをお勧めします。次に、あなたの文は次のようになります。これは、のようなものヘルパーモジュールのための仕事です

<span class="label <%= plan_hash[@user.plan_id][:klass] %>"><%= plan_hash[@user.plan_id][:description] %></span> 
0

は、ヘルパーメソッドを定義します。この:

module UserPlanHelper 
    PLANS = { 
    1 => [ "info", "Plan1" ], 
    2 => [ "warning", "Plan2" ], 
    3 => [ "info", "Plan3" ], 
    4 => [ "warning", "Plan4" ], 
    5 => [ "info", "Plan5" ], 
    6 => [ "warning", "Plan6" ], 
    7 => [ "info", "Plan7" ], 
    8 => [ "warning", "Plan8" ] 
    } 

    def plan_details(plan_id) 
    yield(PLANS[plan_id]) 
    end 
end 

<%= plan_details(@user.plan_id) do |label_class, label| %> 
    <span class="label label-<%= label_class %>"><%= label %></span> 
<%- end %> 
+0

ここでは正しいトラックではあるが、まだまだまあまあである。 – tadman

+0

'' klass'と 'description'の間に何らかの相関がある場合、私はヘルパーメソッドをリファクタリングできます。ユーザーは何も指定していないので、私はそれを明快かつ単純に保っています。 :) –

0
<span class="label label-<%= @user.add_warning? ? 'warning' : 'info' %>"> 
    Plan<%= @user.plan_id.to_s %> 
</span> 

使用ユーザーモデルでは、この方法:

def add_warning? 
    self.plan_id.in?([2, 4, 6, 8]) 
end 
関連する問題