2016-03-22 7 views
0

私は自分のスキャフォールディングテンプレート、具体的にはcreate.gspファイルを作成しています。私は自分のクラスで定義されたプロパティを取得したいと思います。私はこれを行う方法について多くの投稿をオンラインで見ましたが、どれもうまくいかないようです。生成-全て使用すると、次のエラーを取得Grailsスキャフォールディングテンプレート - ドメインクラスからプロパティを取得する

<% 
    domainClass.properties.each { 
     println " ${it.type} ${it.name}" 
    } 
%> 

は、以下の(grails templates - scaffolding controller)を試み

また、このアプローチを試みた
Error occurred running Grails CLI: No such property: domainClass for class: groovy.lang.Binding 

<% import grails.persistence.Event %> 

<% 
excludedProps = Event.allEvents.toList() << 'version' << 'dateCreated' << 'lastUpdated' 
persistentPropNames = domainClass.persistentProperties*.name 

props = domainClass.properties.findAll { persistentPropNames.contains(it.name) && !excludedProps.contains(it.name) && (domainClass.constrainedProperties[it.name] ? domainClass.constrainedProperties[it.name].display : true) } 
Collections.sort(props, comparator.constructors[0].newInstance([domainClass] as Object[])) 

for (p in props) { %> 

<g:message code="${domainClass.propertyName}.${prefix}${p.name}.label" default="${p.naturalName}" /> 

<% } %> 

次の取得をgenerate-all使用時のエラー:

Error occurred running Grails CLI: Failed to parse template script (your template may contain an error or be trying to use expressions not currently supported): startup failed: 
GStringTemplateScript4.groovy: 2: Unknown type: IMPORT at line: 2 column: 54. File: GStringTemplateScript4.groovy @ line 2, column 54. 
    turn { out -> out << """"""; import gra 

Grails 3では何か不足しているのですか?

Grailsのバージョン3.0.11

ご協力いただきありがとうございます!

+0

可能な変数[grailsテンプレートで利用可能な変数](http://stackoverflow.com/questions/34575451/variables-available-in-grails-templates) –

+0

あなたのクエリについては、この回答を参照してください:https:// stackoverflow。 com/a/34648837/1799527 –

答えて

1

私はgrails 3.2.4バージョンを使用していますが、スキャフォールディングプラグインはフィールドプラグインを使用しています。次のように、プラグインをbuild.gradleファイルに追加します。以下のファイルがAsyncSpec.groovy

  • フォルダのsrc /メイン/テンプレート/足場

    • AsyncController.groovy
    • intを作成しているコマンドを使用して、テンプレート

      grails install-form-fields-templates 
      

      をインストール

      dependencies { 
          ... 
          compile "org.grails.plugins:scaffolding" 
          ... 
      } 
      

    • Controller.groovy
    • 私のようなルックスに、すべてのビューをカスタマイズした
    • create.gsp
    • edit.gsp
    • index.gsp
    • ScaffoldedController.groovy
    • show.gsp
    • Spec.groovy

    twitterブーストラップフィールドをレンダリングするには、フィールドプラグインを使用します。 index.gsmビューでは、テーブルのレンダリングをカスタマイズし、g:tableタグをカスタムコードに置き換えます。

    テーブルレンダリングのために生成される部分です。

    <f:table collection="\${${propertyName}List}" /> 
    

    これは私のカスタムコード、&過去のGrailsのバージョンに&過去の足場コードに基づくとGrails 3.2.4バージョン上で実行するように構成されています。

    <table class="table table-striped"> 
        <thead> 
         <tr> 
         <% 
          def grailsApplication = grails.util.Holders.grailsApplication 
          domainObjetc = grailsApplication.domainClasses.find { it.clazz.simpleName == className }.clazz.newInstance() 
          domainClass= grailsApplication.getDomainClass(domainObjetc.class.name) 
          excludedProps = grails.persistence.Event.allEvents.toList() << 'id' << 'version' 
          allowedNames = domainClass.persistentProperties*.name << 'dateCreated' << 'lastUpdated' 
          props = domainClass.properties.findAll { allowedNames.contains(it.name) && !excludedProps.contains(it.name) && it.type != null && !Collection.isAssignableFrom(it.type) } 
          comparator = new org.grails.validation.DomainClassPropertyComparator(domainClass) 
          Collections.sort(props, comparator) 
          props.eachWithIndex { p, i -> 
           if (i < 6) { 
            if (p.isAssociation()) { 
             %><th class="header"><g:message code="${domainClass.propertyName}.${p.name}.label" default="${p.naturalName}" /></th><% 
            } else { 
             %><g:sortableColumn property="${p.name}" title="\${message(code: '${domainClass.propertyName}.${p.name}.label', default: '${p.naturalName}')}" /><% 
            } 
           } 
          }%> 
          <th></th> 
         </tr> 
        </thead> 
        <tbody> 
        <g:each in="\${${propertyName}List}" var="${propertyName}"> 
         <tr> 
         <% props.eachWithIndex { p, i -> 
           if (i < 6) { 
            if (p.type == Boolean || p.type == boolean) { %> 
          <td><g:formatBoolean boolean="\${${propertyName}.${p.name}}" /></td> 
         <%   } else if (p.type == Date || p.type == java.sql.Date || p.type == java.sql.Time || p.type == Calendar) { %> 
          <td><g:formatDate date="\${${propertyName}.${p.name}}" /></td> 
         <%   } else { %> 
          <td>\${fieldValue(bean: ${propertyName}, field: "${p.name}")}</td> 
         <% } } } %> 
          <td class="link"> 
           <div class="btn-group btn-group-xs"> 
            <g:link action="show" id="\${${propertyName}.id}" class="btn btn-primary btn-sm" role="button"> 
             <span class="glyphicon glyphicon-eye-open"></span> 
             <g:message code="default.button.show.label" default="Show" /> 
             </g:link> 
             <g:link action="edit" id="\${${propertyName}.id}" class="btn btn-primary btn-sm" role="button"> 
             <span class="glyphicon glyphicon-pencil"></span> 
             <g:message code="default.button.edit.label" default="Edit" /> 
             </g:link> 
           </div> 
          </td> 
         </tr> 
        </g:each> 
        </tbody> 
    </table> 
    

    のGrails 3の足場プラグインは、ビューをレンダリングするためにGStringTemplateEngineを使用して、輸入はテンプレートで許可されていない、それらを使用し、ホルダーにgrailsApplicationを取得するために、例えば、完全なパッケージの場所を使用するようにスキップGrails.util.Holders.grailsApplicationでテンプレートにアクセスする必要があります。

    上記のコードでプロパティをソートする必要がありますが、TODOタスクとしてコメントされています。

    更新: ソートのプロパティは、私はあなたのために有用であることを願って、DomainClassPropertyComparatorクラスを使用して行わGrailsの3.1

    でテストすることができます。

  • 関連する問題