2011-04-28 114 views
6

我有一个表格,以用户登录:检查用户名是否可以

<%= form_tag(@action, :method => "post", :name => 'signup' ,:onSubmit => 'return validate();') do %>  
    <%= label_tag(:user, "Username:") %> 
    <%= text_field_tag(:user) %> 

我想检查后没有在数据库中的用户名立即:用户现场失去焦点。我可以用javascript来覆盖这个事件,但我无法从javascipt代码发送Ruby-AJAX请求。

有没有任何方法来检查用户名,而无需在窗体上添加额外的控件(按钮,链接)?

+0

没有Ruby的AJAX请求,你怎么会知道用户名是否在数据库? – rubyprince 2011-04-28 08:42:00

回答

0

为什么不能从javascript代码发送ajax请求?

最好的方法是在焦点丢失时发送GET ajax请求。然后,获取请求可以返回true或false,然后您的JavaScript可以在页面上反映出这一点。

+0

嗯...谢谢。我会考虑的。可能是这个答案。 – demas 2011-04-28 08:40:54

35

你可以使用一些JavaScript(这个用jQuery写的)对AJAX cheking:

$(function() { 
    $('[data-validate]').blur(function() { 
     $this = $(this); 
     $.get($this.data('validate'), { 
      user: $this.val() 
     }).success(function() { 
      $this.removeClass('field_with_errors'); 
     }).error(function() { 
      $this.addClass('field_with_errors'); 
     }); 
    }); 
}); 

这个JavaScript将寻找属性data-validate任何领域。然后它将调用onBlur事件处理程序(焦点在JavaScript世界中丢失)。模糊处理器将发送AJAX请求到data-validate属性中指定的URL,并通过参数user输入值。

下一页修改您的观点与验证URL添加属性data-validate

<%= text_field_tag(:user, :'data-validate' => '/users/checkname') %> 

下一页添加路线:

resources :users do 
    collection do 
    get 'checkname' 
    end 
end 

而最后一步创建您的验证:

class UsersController < ApplicationController 
    def checkname 
    if User.where('user = ?', params[:user]).count == 0 
     render :nothing => true, :status => 200 
    else 
     render :nothing => true, :status => 409 
    end 
    return 
    end 

    #... other controller stuff 
end 
+0

如果你正在使用Bootstrap,你应该添加类'error'而不是'field_with_errors'。此外,使用用户名黑名单进行检查是一个好主意。 – rohitmishra 2012-10-05 09:14:39

+0

非常感谢,这非常有帮助。我很好奇 - 是否有任何缺点使用密码而不是模糊?我刚刚在一个我正在开发的Rails应用程序上实现了这个功能,并且我喜欢用户获得的即时反馈(假设没有任何陷阱我不知道)。 – 2013-07-08 04:34:11

+0

由于较小的服务器流量,我提供了“模糊”事件。但是,如果你应该进行'on-type'检查,那么比'keyup'没有什么不好的地方。 – 2013-07-08 11:28:39