如何检查重复的用户名并通过AJAX通知用户?

时间:2018-02-24 19:20:42

标签: ruby-on-rails ruby ajax activerecord

我目前正在尝试使用我的用户名验证方法来处理区分大小写。普通方法默认将用户名字符视为唯一,我需要它才能看到“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

1 个答案:

答案 0 :(得分:0)

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

如果没有,那么我建议在ActiveRecord回调中这样做。类似的东西:

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

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

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

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