如果表中没有任何内容,则Ruby on Rails中的.each方法

时间:2018-07-20 19:42:00

标签: ruby-on-rails ruby

我有一个产品页面,其中有<% @packs['sample-pack'].each do |pack| %>,并且在表中至少有一个产品时可以使用。当表为空(无产品)时,.each方法将出错。

我相当确定数据库中的表为空,这正在引起这种情况,并且想知道是否存在适当的方法来处理.each“如果”是否存在某些东西? (表是否为空)

提前谢谢!

2 个答案:

答案 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 我希望这对您有意义。