2015-11-10 4 views
0

Я использую Grails 2.3.11.Grails render blank page

Когда я собираюсь localhost:8080/myapp/questionnaire/show/3, приложение показывает пустую страницу. И отладка даже не войдет в один из методов ниже.

class QuestionnaireController { 

def beforeInterceptor = [action: this.&loadQuestionnaire, only: ['show']] 

Questionnaire questionnaireInstance 

def show = { 
    render(view: 'show', model: [questionnaire: questionnaireInstance]) 
} 

private def loadQuestionnaire() { 
    questionnaireInstance = Questionnaire.findById(params.id) 

    if(!questionnaireInstance) { 
     redirectWhenNotFound(params.id) 
    } 
} 

private def redirectWhenNotFound(def id) { 
    flash.message = message(code: 'default.not.found.message', args: [ 
      message(code: 'questionnaire.label'), 
      id 
    ]) 
    redirect(uri: "/") 
} 

Однако, когда я пытаюсь localhost:8080/myapp/questionnaire/show, он идет к loadQuestionnaire(), очевидно, не может найти экземпляр домена, из-за params.id не существует, поэтому он идет к redirectWhenNotFound() и перенаправляет его правильно на главную страницу.

Вопрос: почему он не работает нормально?

Edit:

Он показывает пустую страницу только тогда, когда есть экземпляр с заданным идентификатором, когда нет, он переходит в метод.

В конце концов я нашел решение, которое находится в ответе ниже.

+0

Вы пробовали без 'beforeInterceptor' и без' questionnaireInstance'? Похоже, что это можно было бы сделать более простым способом, и удерживание переменных экземпляра в контроллере обычно не является хорошей идеей. – tylerwal

+0

@tylerwal Этот проект имеет очень похожий пример, разница перенаправляется с помощью 'action' в том же контроллере, а не' uri'. И если вы скажете, что это не очень хорошая идея, было бы хорошо оправдать это мнение. Это может быть не самая лучшая идея, но она позволяет упростить код и не повторять те же шаги во многих методах. DRY. –

+0

Мой первоначальный комментарий был сделан в отношении того, что контроллеры были бы проблемой с одноточечным и проблемным параллелизмом, но после того, как они просмотрели его, они на самом деле запрошены, и проблема не такая большая. Я все еще думаю, что этот код можно сконденсировать и записать более простым способом без перехватчика. – tylerwal

ответ

0

После проверки еще нескольких вещей, что он только терпит неудачу, когда есть экземпляр с данным идентификатором, и он проходит через метод, когда нет экземпляра с данным идентификатором, оказалось, что был с ошибкой столбец в таблице questionnaire, после редактирования Grails обновил схему и не удалил старую.

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

Проблема была в том, что она терпела неудачу, поэтому я оставляю этот ответ для всех, у кого может быть такая же проблема в будущем.