2011-04-28 7 views
6

que tiene una forma de inicio de sesión de usuario:nombre de usuario

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

Quiero comprobar si existe el nombre de usuario en la base de datos inmediatamente después de: campo de usuario pierde el foco. Puedo anular este evento en el formulario con javascript, pero no puedo enviar la solicitud de Ruby-AJAX desde el código de javascipt.

¿Hay alguna manera de verificar el nombre de usuario sin agregar controles adicionales (botones, enlaces) en el formulario?

+0

sin solicitud Rubí-AJAX, ¿cómo sabrá si el nombre de usuario está en la base de datos? – rubyprince

Respuesta

0

¿Por qué motivo no puedes enviar una solicitud de Ajax desde el código de JavaScript?

La mejor manera sería enviar una solicitud GET ajax cuando se pierde el foco. La solicitud get podría entonces devolver verdadero o falso y su javascript podría reflejar esto en la página.

+0

Hmm ... Gracias. Voy a pensar en ello. Puede ser esa es la respuesta. – demas

35

Usted puede utilizar algo de JavaScript (éste escrito con jQuery) para 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'); 
     }); 
    }); 
}); 

Esta JavaScript buscará cualquier campo con el atributo data-validate. Luego asienta el controlador de eventos onBlur (foco perdido en el mundo de JavaScript). El controlador de desenfoque enviará la solicitud AJAX a la URL especificada en el atributo data-validate y pasará el parámetro user con el valor de entrada.

Siguiente modificar su punto de vista para agregar atributo data-validate con validación de direcciones URL:

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

A continuación añadimos la ruta:

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

Y último paso crear su validación:

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

Si está utilizando Bootstrap, debe agregar el 'error' de clase en lugar de' field_with_errors'. Además, es una buena idea consultar con una lista negra de nombre de usuario. – rohitmishra

+0

Muchas gracias, esto fue muy útil. Sin embargo, tengo curiosidad: ¿hay algún inconveniente al uso de la tecla en lugar de desenfoque? Acabo de implementar eso en una aplicación de rieles en la que estoy trabajando y me gustan los comentarios inmediatos que recibe el usuario (suponiendo que no haya ningún truco del que no tenga conocimiento). –

+0

Prefiero el evento 'blur' debido a tráfico de servidor más pequeño. Pero si debe hacer la comprobación 'on-type', entonces no veo algo malo con' keyup'. –

Cuestiones relacionadas