2011-04-28 113 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