我有一个产品页面,其中有<% @packs['sample-pack'].each do |pack| %>
,并且在表中至少有一个产品时可以使用。当表为空(无产品)时,.each
方法将出错。
我相当确定数据库中的表为空,这正在引起这种情况,并且想知道是否存在适当的方法来处理.each
“如果”是否存在某些东西? (表是否为空)
提前谢谢!
答案 0 :(得分:3)
您可以使用&
在调用右侧函数/属性之前执行nil检查。像@packs['sample-pack']&.each
好的做法是将@packs['sample-pack']
提取到变量或诸如helper_method之类的控制器方法中。
答案 1 :(得分:0)
您试图在不存在的对象上调用方法。
一个好的实践是使用Null Object模式。基本上,您将实现一个对象,该对象响应实际对象所响应的方法。例如:
class GueranteedPack
def self.find(id) # this could be any method you need
Pack.find(id) || MissingPack.new
end
end
class MissingPack
def find # same here
'no pack'
end
end
最后:
@packs = GuarantedPack.find(...)
@packs.each do |pack|
问题是,您需要一个实现与真实对象相同的API的对象。这样,您可以避免获取零值,而不必在视图中施加条件。
此代码更易于阅读,不会因不属于此的其他逻辑而使您的视图混乱。
可能您可以这样做:
if @packs['sample-pack'].any?
@packs.each do |pack|
...
end
end
,但是将逻辑放入视图中不是一个好的做法,您应该避免这种情况。 我建议观看此视频-Sandi Metz解释了空对象模式:https://www.youtube.com/watch?v=OMPfEXIlTVE 我希望这对您有意义。