重构 Ruby
Refactoring Ruby
我有三个数组,其中两个来自 JSON。
我需要检查每个数组是否不为 nil 且计数是否大于 0。如果大于 0,则显示 "Hello World",否则显示 "Boo"。
<% if !@arrayOne.nil? && @arrayOne.count > 0 || !@user_json[:user_stuff].nil? && @user_json[:user_stuff].count > 0 || !@user_json[:more_user_stuff].nil? && @user_json[:more_user_stuff].count > 0 %>
<h1>Hello World</h1>
<% else %>
<h1>Boo</h1>
<% end %>
我需要一些帮助来重构这段代码,并且想学习其他方法来解决这个问题。
你可以使用array.blank?
(当然假设你使用的是Rails)来检查数组是否为nil或空,例如:
<% if !@arrayOne.blank? || !@user_json[:user_stuff].blank? || !@user_json[:more_user_stuff].blank? %>
根据经验,您应该将尽可能多的逻辑移至控制器。
按照评论中的建议,也可以使用present?
,和!blank?
一样,提高一点可读性:
<% if @arrayOne.present? || @user_json[:user_stuff].present? || @user_json[:more_user_stuff].present? %>
您可以使用 Enumerable#all?
:
<% if [!@arrayOne, @user_json[:user_stuff], @user_json[:more_user_stuff]].all? { |x|
x && x.count > 0
} %>
...
我会从这样的事情开始:
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 %>
不需要Rails的简单方法:
puts [a, b, c].map(&:to_a).all?(&:empty?) ? 'Boo' : 'Hello World'
我有三个数组,其中两个来自 JSON。
我需要检查每个数组是否不为 nil 且计数是否大于 0。如果大于 0,则显示 "Hello World",否则显示 "Boo"。
<% if !@arrayOne.nil? && @arrayOne.count > 0 || !@user_json[:user_stuff].nil? && @user_json[:user_stuff].count > 0 || !@user_json[:more_user_stuff].nil? && @user_json[:more_user_stuff].count > 0 %>
<h1>Hello World</h1>
<% else %>
<h1>Boo</h1>
<% end %>
我需要一些帮助来重构这段代码,并且想学习其他方法来解决这个问题。
你可以使用array.blank?
(当然假设你使用的是Rails)来检查数组是否为nil或空,例如:
<% if !@arrayOne.blank? || !@user_json[:user_stuff].blank? || !@user_json[:more_user_stuff].blank? %>
根据经验,您应该将尽可能多的逻辑移至控制器。
按照评论中的建议,也可以使用present?
,和!blank?
一样,提高一点可读性:
<% if @arrayOne.present? || @user_json[:user_stuff].present? || @user_json[:more_user_stuff].present? %>
您可以使用 Enumerable#all?
:
<% if [!@arrayOne, @user_json[:user_stuff], @user_json[:more_user_stuff]].all? { |x|
x && x.count > 0
} %>
...
我会从这样的事情开始:
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 %>
不需要Rails的简单方法:
puts [a, b, c].map(&:to_a).all?(&:empty?) ? 'Boo' : 'Hello World'