2010-09-21 3 views
0

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

Главного Вопрос

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

В настоящее время у меня есть контроллер (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") 
     } 
    } 
} 

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

Любые предложения?

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

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

class Author { 

    static hasMany = [books:Book] 

    String authorName 
    String notes 

    String toString() { authorName } 


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

ответ

2

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

+0

Спасибо, что указали, что это было первое, что я пробовал, и это не изменило результат. – StartingGroovy

+0

Ну, они определенно не сохранятся, если вы не назовете этот метод. У вас должно было быть что-то еще неправильное. Убедитесь, что возвращаемое значение save() не равно null. Если это так, есть ошибка проверки, которая останавливает их от сохранения – leebutts

+0

Спасибо, я проверю на это и отправлю обратно. – StartingGroovy

2

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

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

Также оператор возврата здесь не имеет смысла

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] 
+0

Я пошел вперед и изменил мои собрать действия повторить то, что вы сделали это с моим _athor = новым автором («$ abc.author»), и он все еще не добавил их. На самом деле он по-прежнему воспроизводил ту же информацию, что и раньше. Кроме того, почему вы ожидаете увидеть это в действии сохранения? (Я просто оставил его сгенерированным) – StartingGroovy

+0

Я сказал что-то «как» !, Вы не предоставили достаточно кода здесь для полного решения ... Вы не показали, как выглядит объект Author? Вы не указали, что такое исключение, если оно есть? –

+0

Не исключение. Я опубликую, как выглядит объект Author. Мои извинения Аарон, я раньше не занимался сгенерированными представлениями, и я думал, что делать что-то подобное было бы очень похоже на учебные пособия, которые я прочитал.Я не сомневался в вашей работе, просто задавался вопросом, почему вы могли бы сделать что-то подобное :) Сначала я создал приложение grails без db, теперь я хочу его реализовать и столкнулся с ситуацией выше. * публикация объекта автора в оригинальном вопросе * – StartingGroovy