link_to_if调用报错:undefined method `profile' for nil:NilClass 咨询
问题根源:Ruby参数的求值顺序
你踩的这个坑其实是Ruby方法参数的求值规则导致的——不管link_to_if的条件是否成立,所有传入的参数都会先被计算一遍。也就是说,当你退出登录后current_user变成nil,但profile_path(current_user.profile)还是会被执行,自然就抛出了undefined method 'profile' for nil:NilClass的错误,link_to_if并没有能力提前拦截这个参数的计算。
正确的实现方式
要解决这个问题,你可以把路径的构建逻辑放到link_to_if的块里,因为只有当条件为真时,块内的代码才会被执行。这样当current_user不存在时,profile_path相关的代码根本不会被调用:
# 推荐写法:用块包裹条件成立时才需要执行的路径逻辑 link_to_if user_signed_in?, "查看我的资料" do profile_path(current_user.profile) end
如果你需要更灵活的控制,也可以先用安全导航操作符确保current_user存在后再构建路径:
# 另一种写法:提前用&.避免nil调用方法报错 link_to_if user_signed_in?, "查看我的资料", current_user&.profile ? profile_path(current_user.profile) : "#"
这里的current_user&.profile是Ruby的安全导航语法,当current_user为nil时会直接返回nil,不会触发方法调用错误。
补充提醒
link_to_if的设计逻辑是:条件为真时渲染完整链接;条件为假时默认只渲染链接文本(你也可以在块里定义假条件下的自定义内容)。但所有位置参数都会在方法调用前被求值,这是Ruby的语言特性,和link_to_if本身的功能无关。以后遇到类似的条件渲染方法,都要注意参数的求值时机哦~
内容的提问来源于stack exchange,提问作者john seymour
相关产品推荐
相关产品推荐

