работа с нестандартными лесами для контроллеров Grails? - PullRequest
3 голосов
/ 12 декабря 2011

Я хотел бы узнать больше о настройке генерации контроллера Grails, но я не могу найти никакой документации.

В частности, моя мотивация заключается в том, что я работаю с устаревшей базой данных, и это только для чтения. Поэтому я хотел бы настроить генерацию кода таким образом, чтобы, если класс домена находился в определенном пакете, например: toppackage.readonly, тогда генерировался только код только для чтения, только методы list и show на контроллерах.

Я немного поиграл с этим, и я не уверен, как именно они разбирают шаблоны. Они содержат теги <%%> и кажутся чувствительными к семантическому пробелу.

Я знаю, что проектные намерения для строительных лесов должны были дать вам отправную точку, но часто случается, что что-то пересматривается позже и изменяется, и восстановление вещей снова кажется расточительным. Также обязательно должны быть соглашения, специфичные для проекта, которые относятся к фазе генерации кода. В нашем случае существуют некоторые требования безопасности, которые относятся к фазе генерации кода.

Как ввести переменную в шаблон кода?

Как оцениваются теги? это форма OGNL?

Пока я делаю это ужасным, уродливым способом, помещая доменные классы в пакет с именем readonly и этим в шаблоне контроллера:

<%=!(packageName=~/\readonly/) ? """    def save = {\n
        def ${propertyName} = new ${className}(params)\n
        if (${propertyName}.save(flush: true)) {\n
            flash.message = \"\${message(code: 'default.created.message', args: [message(code: '${domainClass.propertyName}.label', default: '${className}'), ${propertyName}.id])}\"\n
            redirect(action: \"show\", id: ${propertyName}.id)\n
        }\n
        else {\n
            render(view: \"create\", model: [${propertyName}: ${propertyName}])\n
        }
    }""" : ''%>

1 Ответ

2 голосов
/ 09 марта 2012

Должно работать следующее:

выполнить grails install-templates, чтобы установить шаблоны и изменить их (http://grails.org/doc/1.3.7/ref/Command%20Line/install-templates.html)

<% if (!packageName.contains("readonly")) { %>
    def save = {
        def ${propertyName} = new ${className}(params)
        if (${propertyName}.save(flush: true)) {
            flash.message = "\${message(code: 'default.created.message', args: [message(code: '${domainClass.propertyName}.label', default: '${className}'), ${propertyName}.id])}"
            redirect(action: "show", id: ${propertyName}.id)
        }
        else {
            render(view: "create", model: [${propertyName}: ${propertyName}])
        }
    }
<% } %>

Вам не нужно добавлять \n или экранировать", ${..} если только вы не хотите сгенерировать эти вещи в свой результат (например, сообщение).

Чтобы сделать его коротким:

  • Все, что находится за пределами <% .. %>выводится в результат
  • Все, что внутри <% .. %>, оценивается во время создания леса
  • Все переменные в ${..} разрешаются, когда находятся вне <% .. %>
  • Все переменные получаютразрешается, когда внутри <% .. %>, ${..} не требуется
  • Переменные необходимо экранировать, если вы хотите, чтобы они генерировались как переменные, а не как разрешенные значения (\${..})
...