Предотвращение записи в базу данных с контроллера Grails - PullRequest
0 голосов
/ 20 июня 2019

У меня есть небольшой проект Grails, который я пишу как учебное упражнение.Он собирает некоторый пользовательский ввод из формы (например, введите два числа для добавления), затем вызывает службу для обработки этих данных (например, добавляет два числа) и, наконец, отображает результаты на другой странице.

Когда я включил ведение журнала SQL, я заметил, что данные, которые вводит пользователь, сохраняются в базе данных перед вызовом метода service внутри контроллера.

Как мне предотвратить это?Я хотел бы, чтобы ОДНА запись в базу данных была завершена после обращения к методу обслуживания и без ошибок.

Сохранение метода из кода контроллера:

 def save() {
      def myInstance = new myDomainClass(params)
      myInstance.sessionId = session.id
      myService argh = new myService()

      // wtf does this do?
      if (!myInstance.save(flush: true)) {
           render(view: "create", model: [myInstance: myInstance])
           return
       }

       // Execute the api and process the results. what is writing the user input to the database before this call?!?!?!?!

       def results1 = argh.executeApi(myInstance)

      // if the results are null throw an error
      if (results1 == null) {
          flash.message = message(code: 'api.null.error')
          render(view: "create", model: [apiInstance: apiInstance])
          return
      } else {
          forward(action: "list", id: 2, model: [apiInstanceList: Api.list(params), apiInstanceTotal: Api.count()])
      }
 }

Указатели или помощь приветствуются.

1 Ответ

0 голосов
/ 20 июня 2019

Вызов .save(flush:true) автоматически сохранит экземпляр myInstance в базе данных в этот момент. Вы захотите переместить .save(flush:true) после метода обслуживания, и, поскольку вы сказали, что хотите убедиться, что ошибок нет, вы захотите добавить его к условному:

def save() {
      def myInstance = new myDomainClass(params)
      myInstance.sessionId = session.id
      myService argh = new myService()

       // Execute the api and process the results. what is writing the user input to the database before this call?!?!?!?!

       def results1 = argh.executeApi(myInstance)

      // if the results are null throw an error
      if (results1 == null) {
          flash.message = message(code: 'api.null.error')
          render(view: "create", model: [apiInstance: apiInstance])
          return
      } else {
           // save here when you know there are no errors
           if (!myInstance.save(flush: true)) {
               render(view: "create", model: [myInstance: myInstance])
               return
           }
          forward(action: "list", id: 2, model: [apiInstanceList: Api.list(params), apiInstanceTotal: Api.count()])
      }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...