使用jquery和Ajax在rails中检查用户名可用性

我正在使用带有jquery和ajax的rails来检查用户名的可用性。 我使用以下插件进行jqueryvalidation。

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 

这是编写方法的正确方法吗? 我检查了这个论坛中的许多用户名可用性post,但没有任何结果。

我正在补充答案。 对不起,迟到的家伙们。

首先归功于插件: https : //github.com/posabsolute/jQuery-Validation-Engine 。 在应用程序中使用该插件进行validation。

在视图中,我有

 <%= f.username_field :username, :id => 'free-user', :placeholder=>'User Name', :class => "validate[required, ajax[ajaxUserCall]]", "data-prompt-position" => "topLeft:0,9"%> 

在同一视图中,在java脚本中:

  

在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 

要检查用户名/电子邮件可用性,请执行以下操作:

使用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]]" %> 

根据正确的function,始终将AJAX调用作为最后一次validation。

不要忘记在文档的头部[以js的顺序]包含jquery.js,jquery.validationEngine-en.js,jquery.validationEngine.js和validationEngine.jquery.css并调用a

  

如果您想为用户名执行此操作,只需适当地编辑上述内容即可。