我目前正在尝试使用我的用户名验证方法来处理区分大小写。普通方法默认将用户名字符视为唯一,我需要它才能看到“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
答案 0 :(得分:0)
您是否在username
进入数据库之前对其进行规范化?
如果没有,那么我建议在ActiveRecord回调中这样做。类似的东西:
class User
# ...
before_save -> { self.username = self.username.downcase }
# ...
end
然后控制器助手中的查询(或User
上的类方法...)可以简化为:
User.find_by(username: params[:username])
此外,1)如果您的数据库中已有数据,则应创建一个迁移,为所有历史数据执行此操作; 2)添加唯一性约束和/或ActiveRecord验证以防止重复的用户名。