其实道理很简单,就是在User控制器的update方法中有一个验证:
def user_params
params.require(:user).permit(:name,:email,:password,:password_confirmation)
end
如果params里面没有user,或者user里没有上面那些指定的属性名则中断代码,而在测试里引发这一错误的是以下一句:
before { patch user_path(user) }
patch方法是向后面的路径发送PATCH请求,而后面的user_path(user)则会生成如下路径:
/users/user_id
可以很清楚的看到以上行为没有向params传递任何user参数,所以会报如题的错误.
而接下来我们在User控制器中做了如下改动:
before_action :signed_in_user,only:[:edit,:update]
def signed_in_user
redirect_to signin_url,notice:"Please sign in." unless signed_in?
end
原来出错的测试就得以通过,其的原因就是代码流在用户没有登录的时候会直接跳转到signin_url中,根本不会进行上面的params验证,所以错误自然得以消除.