2015-12-16 105 views
3

我有三个数组,其中两个来自JSON。重构红宝石

我需要检查每个数组是否为零且计数大于0.如果任何大于0的显示“Hello World”,则显示“Boo”。

<% if [email protected]? && @arrayOne.count > 0 || [email protected]_json[:user_stuff].nil? && @user_json[:user_stuff].count > 0 || [email protected]_json[:more_user_stuff].nil? && @user_json[:more_user_stuff].count > 0 %> 
<h1>Hello World</h1> 
    <% else %> 
<h1>Boo</h1> 
<% end %> 

我需要一些帮助重构此代码,并希望学习其他方法来解决这个问题。

回答

5

您可以使用array.blank?(假设你使用当然Rails)的检查数组是否是零或空,如:拇指

<% if [email protected]? || [email protected]_json[:user_stuff].blank? || [email protected]_json[:more_user_stuff].blank? %> 

规则,你应该尽可能多的逻辑移至控制器尽你所能。


正如评论所说,你也可以使用present?,这是一样的!blank?,提高可读性位:

<% if @arrayOne.present? || @user_json[:user_stuff].present? || @user_json[:more_user_stuff].present? %> 
+0

如果'@ arrayOne'是'nil',这将抛出'NoMethodError:未定义的方法“空白? “为零:NilClass'。 (@user_json [:user_stuff]','@user_json [:more_user_stuff]') – falsetru

+0

@falsetru你是说如果@arrayOne等是'undefined'? AFAIK'blank?'在测试空之前测试nil,这样'nil.blank?'返回true。 – brito

+0

这是我用'nil.blank获得的东西?'http://i.imgur.com/xUe8bIM.png(Ruby 2.2.2) – falsetru

1

我会从这样的事情开始:

if [@arrayOne, @user_json[:user_stuff], @user_json[:more_user_stuff]].any?(&:present?) 

在接下来的一步中,我会把这个条件移入一个名字很好的助手。不幸的是,你没有提供你为什么需要这个检查(为什么会提示一个好名字)。但作为一个理念:

# in a helper 
def something_to_show? 
    [ @arrayOne, @user_json[:user_stuff], @user_json[:more_user_stuff] 
    ].any?(&:present?) 
end 

# in the view 
<% if something_to_show? %> 
    <h1>Hello World</h1> 
<% else %> 
    <h1>Boo</h1> 
<% end %> 
0

不需要导轨的一个简单方法:

puts [a, b, c].map(&:to_a).all?(&:empty?) ? 'Boo' : 'Hello World'