我正在使用带有jquery和ajax的rails来检查用户名的可用性。我在用 以下用于jquery验证目的的插件。
https://github.com/posabsolute/jQuery-Validation-Engine
在我的控制器中,我使用以下方法检查用户名可用性。
def check_name
name = params[:name]
if name.strip == ""
render :json => { :available => false }
return
end
user = User.find(:first, :conditions => [ "name = ?", name])
if user
render :json => ["name", false , "This name is already taken"]
else
render :json => ["name", true , ""]
end
end
这是编写方法的正确方法吗?我检查了许多用户名可用性 在这个论坛上的帖子,但没有任何成效。
答案 0 :(得分:6)
我正在补充答案。对不起,迟到的人。
插件的第一个功劳:https://github.com/posabsolute/jQuery-Validation-Engine。 在应用程序中使用该插件进行验证。
在视图中,我有
<%= f.username_field :username, :id => 'free-user', :placeholder=>'User Name', :class => "validate[required, ajax[ajaxUserCall]]", "data-prompt-position" => "topLeft:0,9"%>
在同一视图中,在java脚本中:
<script type="text/javascript">
$(document).ready(function(){
$("#free-user").bind("jqv.field.result", function(event, field, errorFound, prompText){
if(errorFound){
$(".continue").attr("disabled", false); // .continue is a button
} else{
$(".continue").attr("disabled", true);
}
})
});
</script>
在routes.rb中,我有以下路线。
match '/check-user' =>"users#check_user" // creating route for ajax call
在jquery.validationEngine-en.js文件中,我有以下内容:
"ajaxUserCall": {
"url": "/check-user",
// you may want to pass extra data on the ajax call
"alertText": "* This user is already taken",
"alertTextLoad": "* Validating, please wait"
},
在用户控制器中,我有以下方法
def check_user
user = params[:fieldValue]
user = User.where("username = ?", username).first
if user.present?
render :json => ["free-user", false , "This User is already taken"]
else
render :json => ["free-user", true , ""]
end
end
答案 1 :(得分:2)
要检查用户名/电子邮件可用性,请执行以下操作:
使用https://github.com/posabsolute/jQuery-Validation-Engine
编辑AJAX调用的validationsEngines-en.js文件,电子邮件的一个文件如下所示:
"ajaxEmailAvailable": {
"url": "/route_to_send_the_parameters",
// you may want to pass extra data on the ajax call
"alertTextOk": "* This email is available",
"alertText": "* This email is already taken",
"alertTextLoad": "* Validating, please wait"
},
确保配置routes.rb文件以匹配您要使用的路由,该调用的默认操作是GET HTTP请求。
接下来在控制器中设置正确的操作来处理请求(我在Application Controller中包含了一个帮助程序,以便在数据库中查询之前可以清理输入值:
控制器处理请求
def username_availability
scrubb = help.sanitize(params[:fieldValue], :tags => '')
user = User.find_by_email(scrubb)
if user.blank?
render :json => ["INPUT_ID", true , ""]
else
render :json => ["INPUT_ID", false , "This email is already taken"]
end
end
如果您不确定正确的INPUT ID,请在服务器日志中查看呼叫期间传递的参数,并进行简单的复制粘贴。默认情况下,请求会传递INPUT ID和INPUT VALUE。
要获得对此助手的访问权,请添加以下内容:
应用程序控制器
def help
Helper.instance
end
class Helper
include Singleton
include ActionView::Helpers::TextHelper
end
现在在表单上,您的输入应如下所示:
<%= c.text_field :email, "data-validation-engine"=>"validate[required, custom[email], ajax[ajaxEmailAvailable]]" %>
根据正确的功能,始终将AJAX调用作为最后一次验证。
不要忘记在文档的头部[以js的顺序]包含jquery.js,jquery.validationEngine-en.js,jquery.validationEngine.js和validationEngine.jquery.css并调用< / p>
<script type="text/javascript">$(function() {$("#FORM_ID").validationEngine();});</script>
如果您想对用户名执行此操作,只需适当编辑以上内容。