Rails渲染nil User报undefined method `name' for nil:NilClass解决办法
错误原因
你设置的optional: true仅作用于ActiveRecord的关联校验环节,允许这三个裁判关联字段存nil值,不会在保存Assignment时触发「关联对象必须存在」的校验错误,但它不会处理视图层调用nil对象方法的逻辑,你直接对nil值调用name方法自然会抛出undefined method 'name' for nil:NilClass错误。
解决方案
你只需要在视图中调用name前增加nil判断即可,最便捷的方式是使用Ruby的安全导航操作符&.,当关联对象为nil时会直接返回nil,渲染到页面就是空白,完全符合你的需求,修改后的_feed.html.erb代码如下:
<div> <% @games.each do | game | %> <p ><%= game.home_team %> vs <%= game.away_team %></p> <p >Center Referee: <%= game.assignment.center_referee&.name %></p> <p >AR1: <%= game.assignment.assistant_referee_1&.name %></p> <p >AR2: <%= game.assignment.assistant_referee_2&.name %></p> <br></br> <% end %> </div>
如果使用的是低版本Ruby不支持&.,也可以替换为Rails提供的try方法,写法为game.assignment.center_referee.try(:name),效果一致。
可选优化
你当前Game模型中的after_save :create_assignment回调会在每次更新Game实例时都创建一条新的Assignment记录,建议改成after_create :create_assignment,仅在Game首次创建时生成关联的Assignment即可,避免产生冗余数据。
内容的提问来源于stack exchange,提问作者wayoh22
相关产品推荐
相关产品推荐

