Grails - Очень простой набор значений не работает - PullRequest
0 голосов
/ 20 июля 2010

Контроллер для ошибок:

это метод создания ошибки, я распечатал bugInstance.activities и в нем был мой объект активности

def create = {
        def bugInstance = new Bug()
        def activity = new Activity(description:"created")

        bugInstance.properties = params
        bugInstance.addToActivities(activity)
        return [bugInstance: bugInstance]
    }

Затем я посмотрел на метод сохранения и напечатал ту же самую вещь, и результат равен нулю, так что каким-то образом он потерял созданную мной активность, и я понятия не имею, почему. Это действительно поведение по умолчанию? Я делаю что-то действительно неправильное, потому что, кажется, нет причины, по которой такой простой кусок кода не будет работать.

def save = {

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

Я знаю, что могу обойти это, добавив действие в метод сохранения, но почему я теряю действие из create () -> save ()

Ответы [ 3 ]

1 голос
/ 20 июля 2010

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

def create = {
   def bugInstance = new Bug()
   def activity = new Activity(description:"created")

   bugInstance.properties = params
   bugInstance.addToActivities(activity)
   bugInstance.save()
   return [bugInstance: bugInstance]
}

Вам не нужно сохранять действие, потому что оно будет транзитивно сохранено, поскольку оно находится в коллекции действий.

0 голосов
/ 20 июля 2010

Если вы используете автоматически сгенерированный create.gsp, набор действий не будет включен в форму.Это, конечно, есть в модели, но на стороне клиента не будет отображаться поле действий.Когда он возвращается, чтобы сохранить, становится ясно, что действие потеряно.В зависимости от того, чего вы хотите достичь, вы можете добавить некоторый селектор действий в create.gsp или (для начала) скрытое поле с описанием ваших действий, но затем в действии сохранения, я думаю, вы должны обрабатывать параметр действий в любомслучай, так как магия грааля не идет так далеко, как создание для вас Activity.Так же, как вы создаете экземпляр ошибки в действии сохранения, вы должны создать экземпляр действия и даже сохранить его, если хотите, чтобы он был сохранен.

Редактировать : Если вы действительноЕсли вы хотите обойти весь список действий, вы можете использовать индексированные свойства.

В create.gsp добавить это:

<g:each status="i" var="activity" in="${bugInstance.activities}">
  <!-- one hidden field for each property of each attached activity  -->
  <g:hiddenField
    name="activities[${i}].description"
    value="${activity.description}" />
</g:each>

А в методе сохранения это:

params.activities.each{ activity ->
  bugInstance.addToActivities(new Activity(activity))
}

Но в вашем случае может быть достаточно создать экземпляр одного действия из одного поля.

0 голосов
/ 20 июля 2010

может звучать как глупый вопрос, но вы устанавливаете скрытый параметр или что-то в create.gsp с экземпляром ошибки, созданным в create ?? Я имею в виду, я не вижу ничего плохого в том, что ты здесь делаешь. Как выглядит ваш create.gsp?

...