2016-02-08 4 views
6

В Грааль 2.4.x был шаблон с именем src/templates/scaffolding/Controller.groovy, который был использован для создания CRUD действия для динамических подмостей, как:Grails3 шаблон контроллера для динамических подмостей

class BookController { 
     static scaffold = domain.Book 
     static responseFormats = ['html', 'json'] 
} 

В Грааль 3 (3.1.x) знакопеременных этого файла (вероятно, 3.0.x install-templates создал один для меня) просто не работает. Есть ли способ изменить поведение по умолчанию динамических лесов в grails 3 (.1)? install-templates создает файл src/main/templates/scaffolding/ScaffoldedController.groovy, но его содержимое выглядит как мой класс BookController. Документация об этом ничего не говорит.

ответ

0

Я думаю, что вы ищете generate-controller.

+0

№ 'generate-controller' создает фактический файл/класс для контроллера scaffoldin g конкретный класс домена. Посмотрите на ситуацию, когда у вас есть десятки таких файлов, и вы хотите изменить какое-либо поведение в приложении, например «каждое действие сохранения должно перенаправить обратно на предыдущий контроллер, вызывающий действие редактирования» - десятки файлов для изменения. И 'templates/Controller.groovy' был файлом, который запустил каждый динамический эшафот, созданный« на лету »с помощью' static scaffold = domain.class' внутри контроллера. – mkr

1

Посмотрите на команду create-script.

create-script quick ref...

create-script User Guide

Это позволит вам создать свой собственный сценарий, чтобы сделать генерацию кода, но я не верю, что позволяет получить доступ к свойствам домена Горм в Grails 3. (1) , Я фактически разместил этот вопрос здесь: How can I access GORM object properties in a GroovyScriptCommand?

Сначала я запустил команду install-templates, а затем команду create-script, но не уверен, если это необходимо, но это дало мне некоторые ограниченные шаблоны примеров, на которые нужно было смотреть.

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

SRC/основные/скрипты/гэта создать экран-заводной:

import grails.build.logging.ConsoleLogger 

description("Creates a GETA scaffolded controller, views, and integration test artifacts") { 
    usage 'geta-create-screen [domain name]' 
    completer org.grails.cli.interactive.completers.DomainClassCompleter 
    argument name:'Controller Name', description:"The name of controller", required:true 
    flag name:'force', description:"Whether to overwrite existing files" 
} 

def model = model(args[0]) 
def overwrite = flag('force') ? true : false 

println "DAC: model.className:..... ${model.className}" 
println "DAC: model.fullName:...... ${model.fullName}" 
println "DAC: model.propertyName:.. ${model.propertyName}" 
println "DAC: model.packageName:... ${model.packageName}" 
println "DAC: model.simpleName:.... ${model.simpleName}" 
println "DAC: model.lowerCaseName:. ${model.lowerCaseName}" 
println "DAC: model.packagePath:... ${model.packagePath}" 

render template: template('scaffolding/EtaController.groovy'), 
    destination: file("grails-app/controllers/${model.packagePath}/${model.convention("Controller")}.groovy"), 
    model: model, 
    overwrite: overwrite 

render template: template('scaffolding/EtaDomainObject.groovy'), 
    destination: file("grails-app/domain/${model.packagePath}/${model.convention("Domain")}.groovy"), 
    model: model, 
    overwrite: overwrite 

render template: template('scaffolding/EtaService.groovy'), 
    destination: file("grails-app/services/${model.packagePath}/${model.convention("Service")}.groovy"), 
    model: model, 
    overwrite: overwrite 

render template: template('scaffolding/EtaGsp.gsp'), 
    destination: file("grails-app/views/${model.packagePath}/${model.propertyName}/${model.propertyName}.gsp"), 
    model: model, 
    overwrite: overwrite 

render template: template('scaffolding/EtaGspTabHeader.gsp'), 
    destination: file("grails-app/views/${model.packagePath}/${model.propertyName}/_tabHeader.gsp"), 
    model: model, 
    overwrite: overwrite 


return true 

Шаблон: SRC/главная/шаблоны/Строительные леса/EtaController.groovy

<%=packageName ? "package ${packageName}" : ''%> 

class ${className}Controller { 

    static scaffold = ${className} 

    def index(){ 
     render view: "${packageName.replaceAll('\\\\', '/')}/${propertyName}/${propertyName}.gsp" 
    } 

} 

Чтобы выполнить команда: grails geta-create-screen my.package.MyClass --force --stacktrace --verbose

+0

Интересно, но это совершенно другая функциональность. Мой вопрос касался динамических лесов - что-то, что настраивает контроллер во время выполнения, используя некоторые кучу CRUD-действий. Командный скрипт замораживает эти действия по времени генерации и гораздо сложнее поддерживать. Если вам нужно что-то изменить, вам необходимо реорганизовать или сгенерировать каждый сгенерированный контроллер. В Grails 2.x динамические строительные леса работали, как такое перегенерирование каждого контроллера, имеющего «статичный подпор» при компиляции приложения, поэтому этого было достаточно, чтобы изменить используемый там шаблон, но в grails 3 это не работает. – mkr