首页 > 解决方案 > Ruby On Rails 设计使用用户名而不是电子邮件注册和登录

问题描述

我正在尝试使用 devise views/devise/registrations/new/html.erb将用户名字段添加到我的注册中

<h2>Sign up</h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  <%= render "devise/shared/error_messages", resource: resource %>

  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
  </div>
  
  <div class="field">
    <%= f.label :username %><br />
    <%= f.text_field :username, autofocus: true, autocomplete: "email" %>
  </div>

  <div class="field">
    <%= f.label :password %>
    <% if @minimum_password_length %>
    <em>(<%= @minimum_password_length %> characters minimum)</em>
    <% end %><br />
    <%= f.password_field :password, autocomplete: "new-password" %>
  </div>

  <div class="field">
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation, autocomplete: "new-password" %>
  </div>

  <div class="actions">
    <%= f.submit "Sign up" %>
  </div>
<% end %>

<%= render "devise/shared/links" %>

我收到一个错误:“#Usermanagement:0x00007f3db801a8e0 的未定义方法‘用户名’”我做错了什么?我是 ROR 的新手,所以请帮我弄清楚。谢谢!

标签: ruby-on-railsruby

解决方案


假设您已将您的设计模型命名为用户

  • 向设计用户模型添加username字段
$ rails generate migration add_username_to_users name:string
  • 迁移文件应如下所示
class AddUsernameToUsers < ActiveRecord::Migration
  def change
    add_column :users, :username, :string
  end
end
  • 迁移数据库
$ rails db:migrate
  • 生成设计视图
$ rails generate devise:views -v registrations
  • 更新注册和编辑个人资料表格
# views/devise/registrations/new.html.erb
# views/devise/registrations/edit.html.erb

  <div class="field">
    <%= f.label :username %><br />
    <%= f.text_field :username, autofocus: true %>
  </div>
  • 覆盖设计控制器
  class ApplicationController < ActionController::Base
    # Prevent CSRF attacks by raising an exception.
    # For APIs, you may want to use :null_session instead.
    protect_from_forgery with: :exception

    before_filter :configure_permitted_parameters, if: :devise_controller?

    protected

        def configure_permitted_parameters
            devise_parameter_sanitizer.permit(:sign_up, keys: [:username, :email, :password])
            devise_parameter_sanitizer.permit(:account_update, keys: [:username, :email, :password, :current_password])
        end
  end
  • 添加模型验证
class User < ApplicationRecord
  validates_presence_of :username
  # ...
end

推荐阅读