Rails应用ActionView::Template::Error问题:偶现nil调用错误
这个间歇性模板错误属于空值引用类的间歇性Bug
这个间歇性的模板错误,本质上属于空值引用(Nil Pointer Exception,也就是常说的NPE)类的间歇性Bug,我给你拆解下原因和解决思路:
- 你写的代码
<%= @activity.destination.try(:name) %>里,try方法的作用是:当调用它的对象(也就是这里的destination)不为nil时,才去执行后面的name方法;但如果@activity本身就是nil,那调用.destination这一步就直接报错了——因为nil根本没有destination这个方法,try还没机会发挥作用呢。 - 至于为什么时好时坏?这是因为在部分请求场景下,你的控制器正确给
@activity赋了值(比如查询到了对应的记录),视图就能正常渲染;但在另一些场景里(比如查询没找到记录返回nil、某个分支逻辑漏掉了赋值操作),@activity就是空的,这时候就触发了模板错误。
要快速修复这个问题,你可以改用Ruby的安全导航操作符&.,它能层层处理空值:
<%= @activity&.destination&.name %>
或者也可以给@activity也加上try来兜底:
<%= @activity.try(:destination).try(:name) %>
当然,更稳妥的方式是在控制器层面就做好校验,确保@activity不会是nil(比如用find!替代find,或者在渲染视图前判断空值并做相应处理),从根源上避免空值传递到视图里引发错误。
内容的提问来源于stack exchange,提问作者Santosh Aryal
相关产品推荐
相关产品推荐

