Ruby on Rails Devise新增用户名字段注册出现undefined method错误咨询
Devise用户名注册登录报错
undefined method 'username'修复方案 报错的核心原因是绑定Devise的Usermanagement模型未配置username字段、Devise未放行username请求参数,按以下步骤操作即可修复:
- 步骤1:给Usermanagement表新增
username数据库字段
终端执行命令生成迁移文件:rails g migration AddUsernameToUsermanagements username:string:uniq
执行迁移使字段生效:rails db:migrate - 步骤2:配置Devise强参数放行
username字段
打开app/controllers/application_controller.rb,添加如下代码:before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters # 注册时允许提交username devise_parameter_sanitizer.permit(:sign_up, keys: [:username]) # 编辑账号时允许修改username devise_parameter_sanitizer.permit(:account_update, keys: [:username]) end - 步骤3:配置登录时支持用户名校验
打开app/models/usermanagement.rb,添加如下代码:# 配置Devise登录时支持用户名/邮箱二选一校验 def self.find_for_database_authentication(warden_conditions) conditions = warden_conditions.dup if login = conditions.delete(:login) where(conditions.to_h).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first else where(conditions.to_h).first end end - 步骤4:修改登录视图适配登录逻辑
打开views/devise/sessions/new.html.erb,将原邮箱输入框替换为以下代码:
小提示:你当前提交的注册视图中,<div class="field"> <%= f.label :login, "用户名/邮箱" %><br /> <%= f.text_field :login, autofocus: true %> </div>username字段的autocomplete属性误写为了"email",建议修改为"username"避免浏览器自动填充错误。 - 步骤5(可选):如果要完全取消邮箱作为必填项,可在
app/models/usermanagement.rb中添加如下代码覆盖Devise默认规则:def email_required? false end def will_save_change_to_email? false end
内容的提问来源于stack exchange,提问作者Kim Gordon
相关产品推荐
相关产品推荐

