2010-09-21 4 views
0

D'accord, j'ai posé une question avant mais je n'étais pas tout à fait sûr à ce sujet. Alors je suis allé de l'avant et j'ai attendu jusqu'à maintenant pour demander à nouveau.Contrôleurs de Grails ajoutant des instances

question principale

Comment puis-je ajouter une nouvelle instance du domaine par le contrôleur? J'ai créé une fonction nommée rassembler pour lire un fichier avec des données, puis créer un nouveau livre avec les informations spécifiques, mais il ne l'ajoute pas du tout à la base de données.

J'ai actuellement un contrôleur (bookController) et le domaine pour cela.

Mon domaine est assez simple:

class Book { 

    static belongsTo = Author 

    String toString() { bookNumber } 

    Author bookAuthor 
    String title 


    static constraints = { 
     bookAuthor() 
     title() 

    } 
} 

Je viens de « produit » mon point de vue j'ai donc la base créer, modifier, liste et spectacle. Je suis allé de l'avant et ajouté le mien à l'intérieur du contrôleur appelé recueillir. Pour le gsp, je viens de copier sur 'list.gsp' car je veux juste que l'utilisateur affiche la liste des livres une fois la fonction de collecte terminée.

Voici ce que mon contrôleur ressemble (juste généré un plus recueillir de base):

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") 
     } 
    } 
} 

Le gsp apparaît, mais pour une raison quelconque mes nouveaux livres ne sont pas ajoutés. Lorsque j'ajoute un println pour tester si l'information est dans la liste, elle affiche des impressions avec les informations correctes. Je suis donc confus quant à savoir pourquoi il ne «crée» pas la nouvelle instance de livre et ne l'ajoute pas à la base de données.

Des suggestions?

Modifier

classe de domaine pour auteur:

class Author { 

    static hasMany = [books:Book] 

    String authorName 
    String notes 

    String toString() { authorName } 


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

Répondre

2

Vous n'êtes pas appeler .save() sur l'une des instances Livre ...

+0

Merci d'avoir signalé cela, mais c'était la première chose que j'ai essayé et cela n'a pas changé le résultat. – StartingGroovy

+0

Eh bien, ils ne vont certainement pas enregistrer sauf si vous appelez cette méthode. Vous devez avoir eu quelque chose d'autre aussi. Vérifiez que la valeur de retour de save() n'est pas nulle. Si c'est le cas, il y a une erreur de validation les empêchant de persister – leebutts

+0

Merci, je vais vérifier cela et poster. – StartingGroovy

2

je vous suggets écrire des tests unitaires pour vous contrôleur et/ou objets de domaine. Vos objets ne peuvent pas être créés avec succès avec ce code

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

également la déclaration de retour fait ici aucun sens

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

On dirait que vous avez coupé et code collé sans comprendre ce que fait le code . Je pense que vous voulez faire quelque chose comme ...

// 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

je suis allé de l'avant et a changé ma recueillir des mesures pour reproduire ce vous avez fait ci-dessus avec mon Auteur _athor = new ("$ abc.author") et il ne les a pas encore ajoutés. Il a toujours produit les mêmes informations qu'avant. Aussi, pourquoi vous attendez-vous à voir cela dans l'action de sauvegarde? (Je l'ai juste laissé généré) – StartingGroovy

+0

J'ai dit quelque chose "comme"! Vous n'avez pas fourni assez de code ici pour une solution complète ... Vous n'avez pas montré à quoi ressemble l'objet Auteur? Vous n'avez pas montré quelle est l'exception, le cas échéant? –

+0

Il n'y a aucune exception. Je posterai à quoi ressemble l'objet Auteur. Mes excuses Aaron, je n'ai pas traité de vues générées auparavant et je pensais que faire quelque chose comme ça serait assez similaire aux tutoriels que j'avais lus.Je ne remettais pas en question votre travail, je me demandais juste pourquoi vous auriez pu faire quelque chose comme ça :) Au début, j'ai créé l'application Grails sans aucun DB maintenant, je voulais l'implémenter et j'ai rencontré la situation ci-dessus. * poster auteur objet dans la question d'origine * – StartingGroovy

Questions connexes