Доменный объект Grails ArrayList внезапно пуст - PullRequest
0 голосов
/ 26 января 2012

В настоящее время я разрабатываю приложение Grails 1.3.7, которое будет использоваться для организации лекций, семинаров и других материалов, связанных с университетами.В этом контексте, репетиторы должны иметь возможность назначать темы, выбранные студентами ранее.Для этой цели я использую простую «матрицу» таблицы со студентами справа и доступными темами в качестве заголовков таблицы.Теперь преподаватели хотят, чтобы я понял, что строки таблицы перетаскиваемы.Я добился этого с помощью плагина jQuery, и все это прекрасно работает, но я также должен где-то сохранить новый порядок строк, поэтому я решил сохранить его как ArrayList в доменном классе.Я реализовал простую логику, чтобы стирать список и перестраивать его каждый раз, когда преподаватель сохраняет назначения тем.

Код для этих шагов:
Класс домена

class Seminar extends  AbstractLecture {
    ...
    ArrayList<Integer> studentOrder = new ArrayList<Integer>()
    ...

gsp: hiddenField содержит сериализованное представление нового порядка строк, установленное функцией javascript (работает нормально).

<g:form action="saveDistribution">
    <g:hiddenField name="order" id="order" value=""/>
    ...

Контроллер
Функция сериализации плагина возвращает строку, которую я здесь разбиваю, это также не проблема, и идентификаторы правильно содержатся в списке после этого блока.

def saveDistribution = {
....
    if (!params.order.toString().equals("")) {
        seminar.studentOrder.clear() //seminar is the domain object

        def temp = params.order.toString().replace('[','').replace(']','').replace("table-1=", "").replaceFirst('&', '')
        def split = temp.split("&")

        for (id in split) {
            seminar.studentOrder.push(Integer.parseInt(id)) //Works fine
        }
    }

    //If I check seminar.studentOrder here, the parsed values are present

    //Now I redirect to another function (forward would also work, doesn't matter here)
    redirect(action: "distributeTopics", id: params.id)

Но теперь большая проблема: когда яПосле того как после перенаправления, вы увидите check.studentOrder, список полностью пуст ... и я действительно, действительно, не знаю почему.Я сводил меня с ума в последние часы :( Я перепробовал все, что только мог себе представить, чтобы решить эту проблему, но у меня ничего не получалось. Теперь я убежден, что где-то упущен.

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

Заранее большое спасибо, Доминик

ОБНОВЛЕНИЕ (Полный код добавлен для обеих функций контроллера):
Вот код из distribteTopics: Класс TopicTableDataWrapper - это простой Java-класс для сбора необходимых данных, чтобы мне было легче в gsp.
КакВы можете видеть, я просто извлекаю объекты учеников из базы данных с предоставленными идентификаторами из ArrayList studentOrder, но так как список всегда пуст и сохранение тоже не работает ... ну, я застрял здесь.

def distributeTopics = {
    def seminar = Seminar.findById(params.id)
    if (!seminar) {
        flash.message = "Error: Seminar not found. (Database error?)"
        redirect(controller: "lecture", action: "list")
    }

    /*
     * Gather all students and build an ArrayList<TopicTableDataWrapper>, which will be passed to the gsp.
     */
    def wrapperList = new ArrayList<TopicTableDataWrapper>()

    if (seminar.studentOrder.isEmpty()) {
        for (student in seminar.students) {
            //Selected topics
            def topics = seminar.getPrioritizedTopics(student)
            if (topics[0] == null) {
                topics = null
            }

            //Already assigned topic
            def assigned = seminar.getAssignedTopic(student)

            //Comment
            def comment = null
            if (seminar.comments.containsKey(student.id.toString())) {
                comment = seminar.comments.get(student.id.toString())
            }

            wrapperList.push(new TopicTableDataWrapper(student, assigned, comment, topics))
        }
    }
    else {
        for (studentId in seminar.studentOrder) {
            def student = User.findById(studentId)
            if (student == null) continue

            //Selected topics
            def topics = seminar.getPrioritizedTopics(student)
            if (topics[0] == null) {
                topics = null
            }

            //Possibly assigned topic
            def assigned = seminar.getAssignedTopic(student)

            //Comment
            def comment = null
            if (seminar.comments.containsKey(student.id.toString())) {
                comment = seminar.comments.get(student.id.toString())
            }

            wrapperList.push(new TopicTableDataWrapper(student, assigned, comment, topics))
        }
    }

    /*
     * Now we also need a list of all topics.
     * It is important that the list is sorted, because we must map the topic titles to the shortcuts in the gsp!
     * We do this by building a hashmap which just maps 'T1', 'T2', ... as keys to the topics
     */
    def topicList = seminar.topics.sort()
    def map = new HashMap<String, Topic>()

    def i = 1
    for (topic in topicList) {
        map.put("T" + i.toString(), topic)
        i++
    }

    [seminar: seminar, wrapperList: wrapperList, topicMap: map, id: seminar.id]
}

def saveDistribution = {
    def seminar = Seminar.findById(params.id)
    if (!seminar) {
        flash.message = "There was a problem while retrieving the seminar (database error?)."
        redirect(controller: "lecture", action: "list")
    }

    /*
     * Parse the corresponding radiogroup for every student in the seminar
     */
    for (student in seminar.students) {
        //Look if a topic has been assigned by checking the params -> "group <student.id>"
        if (params.containsKey("group " + student.id)) {

            //if that's the case, assign him this topic, but keep his selection for later corrections!
            def topic = Topic.findById(Integer.parseInt(params.get("group " + student.id).toString()))

            //Remove previously assigned topic for this seminar
            def prevTopic = seminar.getAssignedTopic(student)
            if (prevTopic != null) {
                student.removeFromAssignedTopics(prevTopic)
            }
            student.addToAssignedTopics(topic)
        }
    }

    if (!params.order.toString().equals("")) {
        seminar.studentOrder.clear()

        def temp = params.order.toString().replace('[','').replace(']','').replace("table-1=", "").replaceFirst('&', '')
        def splitParam = temp.split("&")

        for (id in splitParam) {
            seminar.studentOrder.push(Integer.parseInt(id))
        }
    }

    flash.message = "Distribution saved."
    seminar.save(failOnError: true) //Still empty list after redirect
    redirect(action: "distributeTopics", id: params.id)
}

1 Ответ

0 голосов
/ 26 января 2012

Хотя нам не хватает некоторых частей кода, который вы написали, приведенный выше комментарий, вероятно, прав.

Я вставляю ссылку на метод сохранения для объекта Grails: http://grails.org/doc/2.0.x/ref/Domain%20Classes/save.html

Если вызов сохранения не работает, пожалуйста, добавьте способ получения объектов в методе distribteTopics .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...