Rails使用Devise时视图无法访问current_user自定义username字段如何解决
错误原因
报错核心原因是current_user.username返回空值(nil),路由user_profile_path要求必须传入username参数,因此触发参数缺失报错。你换成email可以正常运行,也刚好验证了是username本身为空,不是路由、参数白名单配置的问题。
排查&解决步骤
- 首先确认现有用户的username字段是否为空
打开终端进入项目根目录,执行rails c进入控制台,运行以下命令查看当前登录用户的username值:
大概率返回nil,符合报错信息。# 把id替换成你当前登录用户的id User.find(你的用户id).username - 补全存量用户的username
可以直接在控制台批量补全所有空username的用户,示例代码:
如果要求username必须非空,还可以生成数据库迁移文件给username字段加非空约束,避免后续再出现空值问题。User.where(username: nil).find_each do |user| # 这里可以自定义生成规则,比如用id拼接避免重复 user.update!(username: "user_#{user.id}") end - 检查Devise注册表单
你已经在Devise参数白名单里加了username,还要确保注册视图app/views/devise/registrations/new.html.erb里有username的输入项,否则新用户注册时不会提交username,还是会出现空值:<div class="field"> <%= f.label :username, "用户名" %> <%= f.text_field :username, required: true %> </div>
可选优化
如果要长期用username作为路由的唯一标识,可以在User模型中重写to_param方法:
class User < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable # 其他模型代码... def to_param username end end
之后你生成个人资料链接时可以直接写user_profile_path(current_user),不需要手动拼接username参数,代码更简洁。
内容的提问来源于stack exchange,提问作者shengjiang
相关产品推荐
相关产品推荐

