我试图更新对象的属性,但通常我尝试更新的对象不再存在。update_attributes()与update_all()&on已删除的对象
例如为:我是后处理的CSV文件,以获得属性:
array.each do |a|
player = Player.find_by_grepo_id(a[:grepo_id])
player.update_attributes(a)
end
时未找到播放器将抛出一个错误。
我从以往的经验教训:
的ActiveRecord :: Base.find总是抛出异常,如果它没有找到一个纪录,这是故意的。 我应该只使用查找,如果我绝对期望有任何我正在寻找。 如果我正在展示一个show动作并找不到该文章,我应该挽救该异常并呈现404(未找到) 而不是重定向到索引(技术上)。
如果我想通过它的id属性找到某些东西而不强制异常,我应该使用动态查找器 find_by_id(在我的情况下为find_by_grepo_id)如果它没有找到具有该id的记录,将返回false。
但是一旦运行包含上述代码的任务,我得到
NoMethodError: undefined method `update_attributes' for nil:NilClass
这是因为与该特定ID的玩家已经不存在了。如果我使用.present?
方法将update_attributes
调用包装起来。
我在想什么?不应该find_by_id方法不抛出一个错误,只是跳过它?
当您尝试更新时发生错误,而不是查找。所以它不会在'Player.find_by_grepo_id(a [:grepo_id])上抛出一个错误' –
你的错误正在清除告诉,什么是混乱..再次阅读错误。 –
更新调用是否有类似的方式,还是必须将它包装在.present中?方法? –