2016-08-23 21 views
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/关键字/ 1.9/Object.html#method-i-case)语句。 –

+0

可能的重复http://stackoverflow.com/questions/35275608/ruby-refactoring-if-else-statement –

+0

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

回答

3

这是一个辅助模块工作,像这个:

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

小问题:在'plan_details'方法中增加'yield'的目的/好处是什么? –

+0

@UtsavKesharwani这意味着你可以将它作为'plan_details(...)做'来构造,而不需要创建局部变量。 – tadman

+0

'yield'似乎在Ruby的框架级代码之外使用不足。或者,也许这只是我结束查看的代码。 –

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 label-<%= @user.plan.elite ? 'warning' : 'info' %>}"> 
    <%= @user.plan.label %> 
</span> 
0

定义一个辅助方法:

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 <%= plan_hash[@user.plan_id][:klass] %>"><%= plan_hash[@user.plan_id][:description] %></span> 
+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