【问题标题】:How to check for duplicate usernames and notify users with AJAX? [duplicate]如何检查重复的用户名并使用 AJAX 通知用户? [复制]
【发布时间】:2018-08-04 14:55:22
【问题描述】:

我目前正在尝试让我的用户名验证方法能够区分大小写。默认情况下,普通方法将用户名字符视为唯一的,我需要它来查看“John”==“john”。无论单词本身是如何写的,如何让我的 activerecord 查询方法来验证结果?我拥有的代码如下。最后,如何格式化我的 AJAX 请求以提醒用户他们的用户名可用或不可用?我的代码将在没有原因或异常的情况下触发错误块。

控制台错误

ActiveRecord::StatementInvalid (PG::UndefinedFunction: ERROR:  could not identify an equality operator for type json
LINE 1: SELECT DISTINCT "users".* FROM "users" WHERE (username = NUL...
                        ^
: SELECT DISTINCT "users".* FROM "users" WHERE (username = NULL)):

app/controllers/users_controller.rb:30:in `check_duplicate_username'
app/helpers/application_helper.rb:33:in `activate_account_time_zone'

new.html.erb

 $( "#user_username" ).blur(function() {
            $.ajax({
                url: '<%= check_duplicate_username_path %>',
                type: "GET",
                data: { username: $('#username').val() },
                complete: function() {},
                success: function(data, textStatus, xhr) {

                    alert("Your username is available!");
                    if (data.available == false)
                    {
                        $('#username').addClass("error");
                    }
                },
                error: function() {
                    alert("Something went wrong on our end!")
                }
            });
        });

users_controller.rb

def check_duplicate_username
    #@user = User.where('username = ?', params[:username]).first
    @user = User.where('username = ?', params[:username]).distinct
    if @user.present?
      render json: {:success => 0, :message => 'Username taken', :user_available => true}
    else
      render json: {:success => 1, :message => 'Username available', :user_available => false}
    end
  end

routes.rb

get '/check_duplicate_username' => 'users#check_duplicate_username', as: :check_duplicate_username

【问题讨论】:

  • 您的数据库排序规则是什么? (排序规则是数据库用于映射值的一组规则)。
  • 我现在正在使用 Postgres 和 Puma。未在 database.yml 中设置 db 排序规则。
  • 你能做到吗:User.where('upper(username) = ?', params[:username].upcase)
  • db 必须有一个排序规则。没有就不能做比较。找出它是什么。
  • 我尝试了 Keith Bennett 的方法,但我收到了大写的 NoMethod 错误。我的方法是在检查用户名后不会触发javascript。我在控制台中看到正在比较用户名,但视图中没有发生任何事情。

标签: ruby-on-rails ruby ajax activerecord


【解决方案1】:

您是否在 username 进入数据库之前对其进行规范化?

如果没有,那么我建议在 ActiveRecord 回调中这样做。比如:

class User
  # ...
  before_save -> { self.username = self.username.downcase }
  # ...
end

然后您的控制器助手(或User ...上的类方法)中的查询可以简化为:

User.find_by(username: params[:username])

另外,1) 如果您的数据库中已有数据,您应该创建一个迁移来对所有历史数据执行此操作,并且 2) 添加唯一性约束和/或 ActiveRecord 验证以防止重复用户名。

【讨论】:

  • 当我将用户名输入与数据库中的用户名进行比较时,我的 JS 代码没有启动。你能检查我上面的代码看看有什么问题吗?
猜你喜欢
  • 1970-01-01
  • 2015-02-16
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 2016-08-10
  • 1970-01-01
相关资源
最近更新 更多