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)
}
}
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
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
Merci, je vais vérifier cela et poster. – StartingGroovy