2012-01-04 1 views
0

Я довольно новыми для Grails, и фронтенд-разработка в целом, поэтому, пожалуйста, голые со мной ...JQuery Ajax запрос на Grails контроллер не работает

В нижеприведенном «простой» Ajax пример входа в систему, я используя JQuery для отправки параметров формы контроллеру Grail. Однако фактический URL-адрес не соответствует URL-адресу контроллера, настроенному в вызове ajax.

Html:

<div id="loginForm"> 
     <div id="ajaxLoginError"> 
     </div> 
     <form name="ajaxLoginForm" action="ajaxLogin" id="ajaxLoginForm"> 
      <span class="pic"></span> 
      <span class="close"></span> 
      <input type="text" name="username" class="text focus" default="Username" 
       value="${user?.username}" /> 
      <input type="password" name="password" class="text focus" 
       default="Password" value="${user?.password}" /> 
      <button type="submit" name="login" id="ajaxLoginBtn"> 
       <span class="button"><span>Login</span> </span> 
      </button> 
      <label> <input type="checkbox" class="check" name="remember" />Remember 
       me</label> 
      <a href="#">Forgot username or password?</a> 
     </form> 
    </div> 

Javascript:

$('#ajaxLoginBtn').click(function() { 
    $('#ajaxLoginError').fadeOut(); 
    $.ajax({ 
     url: "${createLink(controller: 'user', action: 'ajaxLogin')}", 
     type: 'GET', 
     data: queryString, 
     dataType: 'json', 
     success: function(data) { 
      if (data.isAuthenticated) { 
       // Display user bar 
       $('#loginUserBar').slideDown(); 
      }else { 
       $('#ajaxLoginError').html(data.errorMsg).fadeOut(); 
      } 
     } 
    }); 
}); 

Кроме того, кто может проверить свою логику контроллера. Я понимаю, что это правильный способ разобрать ответ JSON?

Сервер:

def ajaxLogin = { 
    boolean isExists = false 
    String errorMsg = "" 
    def foundUser = User.findByEmailAndPassword(params.username, params.password) 
    if (foundUser) { 
     isExists = true 
    }else { 
     errorMsg = "Login unsuccessful! Either the username, or password entered is incorrect." 
    } 
    render(content: 'text/json', 
     loginResponse(isAuthenticated: isExists, errorMsg: errorMsg)); 
} 

Аналогичным образом, есть все, что мне нужно сделать, чтобы явно заставить Grails использовать JQuery в качестве основной яваскрипта плагин?

Спасибо, -Tom

ответ

1

Есть много разных вопросов ... :-)

1) Что мне нужно сделать, чтобы явно заставить Grails использовать JQuery в качестве основной JavaScript плагин?

Установите плагин jquery, если он еще не установлен. Вы можете также поместить

<g:setProvider library="jquery"/> 

в начале вашего GSP (или в макете), чтобы установить явно JQuery в качестве поставщика

2) Это правильный способ разобрать ответ JSON?

log.info("Receive send request"); 
    def contentType = request.getHeader('Content-Type') 
    log.trace("receive with ContentType: " + contentType) 
    if (contentType && contentType.contains('application/json')) {    
     def results = request.JSON 
     log.info("results received : ${results}") 
    } 

Вы можете добавить if (request.xhr){} для проверки Ajax вызовов

3) кто может проверить свою логику контроллера.

Ничего не сказать о самой логике, вы проверяете для существующего логина/пароля

4) фактический URL не соответствует URL контроллера, сконфигурированный в вызове Ajax.

Трудно ответить только тем, что вы нам сказали. Вызов jQuery ajax кажется хорошим, но мы ничего не знаем о содержании вашего queryString. Я обычно использую $("#myForm").serialize(), чтобы отправить форму контроллерам. . Я не понимаю вашу проблему с URL-адресами, хотя ...

+0

Hi Grooveek, thx для ответа. Что касается проблемы с URL-адресом ... Используя метод ссылки grails, вы должны создать заданный URL-адрес:/myapp/user/ajaxLogin. Однако, когда срабатывает вызов Ajax, фактический URL-адрес разрешает:/myapp/ajaxLogin. Я не совсем уверен, почему Grails опускает имя контроллера на пути. Любые идеи или предложения приветствуются. – princeTaj

+0

Кроме того, что касается переменной queryString, это по существу результат назначения $ ('# ajaxLoginForm'). Serialize(). Я забыл включить назначение в фрагмент кода. Извинения: -o – princeTaj

+0

loginResponse (isAuthenticated: isExists, errorMsg: errorMsg) Что такое varible loginResponse DO или используется? – danielad

Смежные вопросы