Что Ваш любимый Grails отлаживают приемы? [закрытый]

Я думаю, что вам не хватает нескольких элементов или, возможно, вы захотите немного больше изучить, как соединить различные части. Ваш основной запрос не особенно относится к предмету Laravel:

Я хочу остаться в фактическом виде и отображать ответ в виде предупреждения

Суть это не то, что Laravel «выводит из коробки», это не вопрос Laravel, а то, как я могу асинхронно обновлять свою страницу. Для этого вам лучше всего использовать ajax-запрос с последующим предупреждением javascript / jQuery.

Я мог бы сделать что-то вроде этого:

$('#submitButton').on('click', function (e) {
        e.preventDefault(); // Want to stay on the page, not go through normal form  
        // Might be easier to make this a NON submit button - then we can use the rest below and not have to js submit()
        // Grab any extra info via data.
        var item_type = $(this).data('item-type');
        var name = $(this).val();
        $.ajax({
            url: "{{url('user/create/')}}",
            type: "POST",
            data: {
                item_type: item_type,
                name: name
            },
            success: function (name) {
                alert(message);
                // Or, if you want a better looking alert, you can use a library like SWAL:
               swal("Success!", "New user created with a name of: "+name, "success");
            },
            error: function () {
                swal("Error", "Unable to bring up the dialog.", "error");
            }
        });
    });

Вам нужно будет обработать ajax-данные в вашем контроллере и отправить обратно только имя в операторе возврата метода контроллера.

Если вы хотите изменить форму выше и не делать это с помощью оповещения, используйте jQuery в функции успеха, чтобы внести изменения (например, $("#name").text(name); или что-то подобное.

56
задан An̲̳̳drew 26 April 2010 в 18:24
поделиться

6 ответов

Некоторые общие советы:

  • Четкий stacktrace.log, сделайте приложение выполнения чаш Грааля, затем откройте stacktrace.log в средстве просмотра (я предпочитаю less stacktrace.log на Linux)... однажды в Вашем средстве просмотра, ищите .groovy и .gsp..., который обычно приносит Вам к тому, о чем Вы на самом деле заботитесь.
  • , Когда stacktrace относится к номеру строки в файле GSP, необходимо открыть то представление в браузере с ?showSource в строке запроса, т.е. http://localhost:8080/myProject/myController/myAction?showSource... это показывает скомпилированный источник GSP, и все номера строки GSP в stacktrace относятся к скомпилированному GSP, не, фактический источник GSP
  • Всегда, всегда, всегда окружает Ваш, сохраняет по крайней мере с некоторой минимальной обработкой ошибок.

Пример:

try {
    if(!someDomainObject.save()) {
        throw new Exception ("Save failed")
    } 
} catch(Exception e) {
    println e.toString()
    // This will at least tell you what is wrong with
    // the instance you are trying to save
    someDomainObject.errors.allErrors.each {error ->
        println error.toString()
    }
}

Кроме того, многое из него просто сводится к распознаванию stacktraces и сообщениям об ошибках... много времени, Grails невероятно бесполезен в сообщениях об ошибках, которые это дает Вам, но можно учиться распознавать шаблоны, как следующее:

  • Некоторые самые трудные ошибки понять - то, потому что Вы не работали grails clean или grails upgrade... для предотвращения этих проблем, я всегда использую следование командной строки для выполнения чаш Грааля: grails clean; yes | grails upgrade; grails run-app
  • , Если ошибка имеет отношение к дублирующимся определениям класса, удостоверьтесь, что Вы объявляете пакет, которому принадлежит класс наверху файла
  • класса, Если ошибка имеет отношение к метаданным схемы, соединению, сокету или чему-нибудь как этот, удостоверьтесь, что Ваш коннектор базы данных находится в lib/, удостоверьтесь, что Ваши полномочия корректны и в DataSource.groovy и в базе данных для имени пользователя, пароля и хоста, и удостоверяются, что Вы знаете входы и выходы версии своего коннектора (т.е. mysql версия 5.1. X коннектора имеет странную проблему с псевдонимами, которые могут потребовать, чтобы Вы установили useOldAliasMetadataBehavior=true на URL в [1 110])

И так далее. Существует много шаблонов, чтобы учиться распознавать.

33
ответ дан Chris King 26 November 2019 в 17:26
поделиться
  • Для добавления к предложению Chris King на сохранении я записал допускающее повторное использование закрытие:

     Closure saveClosure = { domainObj ->
          if(domainObj.save())
              println "Domain Object $domainObj Saved"
          else
          {
                  println "Errors Found During Save of $domainObj!"
                  println domainObj.errors.allErrors.each {
                      println it.defaultMessage
                  }
          }
       }
    

Затем можно просто использовать его везде, и это будет заботиться о сообщении об ошибке:

  def book = new Book(authorName:"Mark Twain")
  saveClosure(book)
  • Кроме того, я использую плагин отладки - он позволяет дополнительный вход, и я добавил тег к нижней части моего основного - который высказывает мне мнение всех переменных на сессии / запрос.

  • плагин Входа Времени выполнения позволяет позволять регистрироваться во времени выполнения.

  • При записи этого ответа, плагин P6SPY также кажется, что это могло быть полезно - он регистрирует все операторы, которые приложение делает против базы данных путем действия как прокси.

  • Консоль Grails также полезна. Я использую его для интерактивного ввода по абсолютному адресу вокруг и эксперимент с некоторым кодом, который также пригождается во время отладки.

  • И конечно, способность ступить через Отладчик сладка. Я переключился на ИДЕЮ IntelliJ, так как она имеет лучший Grails / поддержка Groovy.

16
ответ дан Jean Barmash 26 November 2019 в 17:26
поделиться

Я когда-то спросил опытного отличного разработчика о том, как он эффективно отладил свои приложения. Его ответ:

я пишу тесты!

И у него есть очень положительная сторона: Если Ваш код будет иметь достаточную единицу и интеграционные тесты, то Вы ничего почти никогда не должны будете отлаживать. Плюс Вы добираются, чтобы сказать самодовольные подобные вещи Вашим поддерживающим разработчикам...

Для Grails:

14
ответ дан mycro.be 26 November 2019 в 17:26
поделиться

Вот некоторые приемы, собранные groovymag от людей Grails в Твиттере:

http://blog.groovymag.com/2009/02/groovygrails-debugging/

2
ответ дан chanwit 26 November 2019 в 17:26
поделиться

Для простых приложений я использую println оператор. Это - очень очень легкий прием. Поскольку сложные приложения используют режим отладки в intellij идее.

1
ответ дан DonX 26 November 2019 в 17:26
поделиться

Я не уверен, можно ли это сделать из коробки, но в веб-приложениях я нахожу полезным иметь подсистему "кто я?" в различных файлах просмотра.

Идея состоит в том, чтобы послать сообщение в HTML, чтобы идентифицировать фрагмент. Это особенно верно, когда я впервые сталкиваюсь с приложением.

В Grails я делаю это с помощью пользовательского тега. Например, рассмотрим list.gsp для Student:

<g:debug msg="student list" />

Here is the code:

class MiscTagLib {
    def debug = { map ->
        if (grailsApplication.config.grails.views.debug.mode == true) {
            def msg = map['msg']
            out << "<h2>${msg}</h2><br/>"
        }
    }
}

The key is that you can leave those tags in there, if желательно, так как они появляются только при включённом режиме в Config.groovy:

grails.views.debug.mode=true
4
ответ дан 26 November 2019 в 17:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: