Контроллеры Grails, добавляющие экземпляры - PullRequest
0 голосов
/ 22 сентября 2010

Хорошо, я задал вопрос раньше, но не был уверен в этом.Так что я пошел дальше и ждал до сих пор, чтобы спросить снова.

Основной вопрос

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

В настоящее время у меня есть контроллер (bookController) идомен для этого.

Мой домен довольно прост:

class Book {

    static belongsTo = Author

    String toString() { bookNumber }

    Author bookAuthor
    String title


    static constraints = {
        bookAuthor()
        title()

    }
}

Я просто «сгенерировал» свои представления, чтобы у меня были базовые функции создания, редактирования, просмотра и отображения.Я пошел дальше и добавил свой собственный контроллер, называемый сбор.Что касается gsp, я просто скопировал «list.gsp», поскольку я просто хочу, чтобы пользователь просматривал список книг после завершения функции сбора.

Вот как выглядит мой контроллер (только основныесгенерирован один плюс сбор):

package bookdemo

import bookClient

class BookController {

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

    def index = {
        redirect(action: "list", params: params)
    }

    def gather = {

        def w = new bookClient()        //bookClient will gather books from txt files
        def hosts = ["localhost"]       //host to connect to

        w.queryData(hosts)          //grab information and parse
        def abc = w.bookList            //list of books
        w.printData(abc)            //print out list of books to make sure its not null

        int numberOfBooks = abc.size()  //list size


    //create book list and return it

        numberOfBooks.times {
        def bookInstance = new Book(Author:"$abc.author", Title:"$abc.title")
            return [bookInstance: bookInstance]
        }


    //params to show once adding books

        params.max = Math.min(params.max ? params.int('max') : 10, 100)
        [bookInstanceList: book.list(params), bookInstanceTotal: book.count()]
    }

    def list = {
        params.max = Math.min(params.max ? params.int('max') : 10, 100)
        [bookInstanceList: book.list(params), bookInstanceTotal: book.count()]
    }

    def create = {
        def bookInstance = new Book()
        bookInstance.properties = params
        return [bookInstance: bookInstance]
    }

    def save = {
        def bookInstance = new Book(params)
        if (bookInstance.save(flush: true)) {
            flash.message = "${message(code: 'default.created.message', args: [message(code: 'book.label', default: 'Book'), bookInstance.id])}"
            redirect(action: "show", id: bookInstance.id)
        }
        else {
            render(view: "create", model: [bookInstance: bookInstance])
        }
    }

    def show = {
        def bookInstance = book.get(params.id)
        if (!bookInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'book.label', default: 'Book'), params.id])}"
            redirect(action: "list")
        }
        else {
            [bookInstance: bookInstance]
        }
    }

    def edit = {
        def bookInstance = book.get(params.id)
        if (!bookInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'book.label', default: 'Book'), params.id])}"
            redirect(action: "list")
        }
        else {
            return [bookInstance: bookInstance]
        }
    }

    def update = {
        def bookInstance = book.get(params.id)
        if (bookInstance) {
            if (params.version) {
                def version = params.version.toLong()
                if (bookInstance.version > version) {

                    bookInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'book.label', default: 'Book')] as Object[], "Another user has updated this Book while you were editing")
                    render(view: "edit", model: [bookInstance: bookInstance])
                    return
                }
            }
             bookInstance.properties = params
            if (!bookInstance.hasErrors() && bookInstance.save(flush: true)) {
                flash.message = "${message(code: 'default.updated.message', args: [message(code: 'book.label', default: 'Book'), bookInstance.id])}"
                redirect(action: "show", id: bookInstance.id)
            }
            else {
                render(view: "edit", model: [bookInstance: bookInstance])
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'book.label', default: 'Book'), params.id])}"
            redirect(action: "list")
        }
    }

    def delete = {
        def bookInstance = book.get(params.id)
        if (bookInstance) {
            try {
                bookInstance.delete(flush: true)
                flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'book.label', default: 'Book'), params.id])}"
                redirect(action: "list")
            }
            catch (org.springframework.dao.DataIntegrityViolationException e) {
                flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'book.label', default: 'Book'), params.id])}"
                redirect(action: "show", id: params.id)
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'book.label', default: 'Book'), params.id])}"
            redirect(action: "list")
        }
    }
}

Появляется gsp, но по каким-то причинам мои новые книги не добавляются.Когда я добавляю println, чтобы проверить, есть ли информация в списке, он показывает отпечатки с правильной информацией.Поэтому я не понимаю, почему он не «создает» новый экземпляр книги и не добавляет его в базу данных.

Есть предложения?

Редактировать

Класс домена для автора:

class Author {

    static hasMany = [books:Book]

    String authorName
    String notes

    String toString() { authorName }


    static constraints = {
        machineName()
        notes(maxSize:500)
    }
}

Ответы [ 2 ]

2 голосов
/ 22 сентября 2010

Вы не вызываете .save () ни в одном из экземпляров Книги ...

2 голосов
/ 22 сентября 2010

Я бы предложил вам написать несколько модульных тестов для вашего контроллера и / или объектов домена. Ваши объекты не могут быть успешно созданы с этим кодом

new Book(Author:"$abc.author", Title:"$abc.title")

Кроме того, выражение return здесь не имеет смысла

    numberOfBooks.times {
    def bookInstance = new Book(Author:"$abc.author", Title:"$abc.title")
        return [bookInstance: bookInstance]
    }

Похоже, вы вырезали и вставили код, не понимая, что делает код. Я думаю, вы хотите что-то еще, как это ...

    // iterate through the list of books and create the object array to pass back
    def bookListInstance = []
    w.bookList.each {
        def bookInstance = new Book(Author:it.author, Title:it.title)
        bookListInstance << bookInstance
    }
    // now return the list of domain objects
    return [bookInstance: bookListInstance]
...