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

问题描述 投票:0回答:2

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

我很确定数据库中的表是空的导致这个并且想知道是否有一种正确的方法来处理.each“if”那里有什么东西? (表是否为空)

先感谢您!

ruby-on-rails ruby
2个回答
3
投票

你可以使用在调用右侧函数/属性之前执行nil-check的&。像@packs['sample-pack']&.each

一个好的实践是将@packs['sample-pack']提取到变量或控制器方法,如helper_method


0
投票

您正在尝试在不存在的对象上调用方法。

一个好的做法是使用Null对象模式。基本上,您将实现一个对象来响应您的真实对象响应的方法。例如:

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的对象。这样,您可以避免在视图中获取nil值并且不得不使用imlement条件。

这段代码更易于阅读,并且不会使用其他逻辑混淆您的视图。

显然你可以这样做:

if @packs['sample-pack'].any?
  @packs.each do |pack|
  ...
  end
end

但是将逻辑放入视图并不是一种好的做法,你应该考虑到这一点。我建议观看这个视频 - Sandi Metz解释Null Object模式:https://www.youtube.com/watch?v=OMPfEXIlTVE我希望它对你有意义。

© www.soinside.com 2019 - 2024. All rights reserved.