5

私はmongodbプラグインでGrails 2.1.1を使用しています。生成されたリストの列の順序を変更する際に問題があります。Grails scaffolding guideが言うように、contraints ブロックの属性を正しく並べ替えるだけで済みます。

私のドメイン:

class Section {

String idName
String visible
String required
String name
String bold

static embedded = ['question']

List<Question> questions
static hasMany = [questions : Question]

static constraints = {
    idName (blank: false)
    name (blank: false)
    visible (blank: false)
    required (blank: false)
    bold (blank: false)
}

@Override
public String toString() {
    name
}
}

ただし、列は依然としてアルファベット順に並べられています。私は静的な足場を使用しているので、制約を変更した後、grails generate-all *コマンドを使用してすべてのファイルをオーバーライドします。

はい、コードのクリーニングとコンパイル、サーバーのクリーニングと再起動 (これは STS に統合されています)、ブラウザーのキャッシュのクリーニングを試みました。mongo データベースに問題はありますか (hibernate プラグインがアンインストールされています)?

その後、grails テンプレートもインストールしました。list.gsp には、並べ替え属性の行があります。

Collections.sort(props, comparator.constructors[0].newInstance([domainClass] as Object[]))

これを変更して、制約で設定した作業順序を取得するにはどうすればよいですか?

4

4 に答える 4

3

Jira 課題に記入する必要があります。https://github.com/grails/grails-core/blob/master/grails-crud/src/main/groovy/org/codehaus/groovy/grails/scaffolding/DefaultGrailsTemplateGenerator.groovyを見ると

 void generateView(GrailsDomainClass domainClass, String viewName, Writer out) {
    def templateText = getTemplateText("${viewName}.gsp")

    if (templateText) {
        def t = engine.createTemplate(templateText)
        def multiPart = domainClass.properties.find {it.type == ([] as Byte[]).class || it.type == ([] as byte[]).class}

        boolean hasHibernate = pluginManager?.hasGrailsPlugin('hibernate')
        def packageName = domainClass.packageName ? "<%@ page import=\"${domainClass.fullName}\" %>" : ""
        def binding = [pluginManager: pluginManager,
                packageName: packageName,
                domainClass: domainClass,
                multiPart: multiPart,
                className: domainClass.shortName,
                propertyName:  getPropertyName(domainClass),
                renderEditor: renderEditor,
                comparator: hasHibernate ? DomainClassPropertyComparator : SimpleDomainClassPropertyComparator]

        t.make(binding).writeTo(out)
    }

}

呼び出し生成ビューが SimpleDomainClassPropertyComparator を使用することを決定することは明らかです。Grails はもともと hibernate に依存するように構築されていました。ここ数年、世界中で追加の永続化メカニズムが使用されてきました。DomainClassPropertyComparator を見ると、休止状態への依存はありません。domainObject "hasConstraints" が使用するコンパレータを決定するか、デフォルトで DomainClassPropertyComparator を単純に使用するかをコードでテストする必要があると思います。制約が見つからない場合の動作は同じです。「hasHibernate」の呼び出しは、DefaultGrailsTemplateGenerator では必要ありません。

回避策として、スキャフォールディング テンプレートをインストールし、_form.gsp を編集して、使用しているコンパレータを DomainClassPropertyComparator (例: my _form.gsp) に変更します。

    <%=packageName%>
<% import grails.persistence.Event %>
<% import org.codehaus.groovy.grails.scaffolding.DomainClassPropertyComparator %>


<%  excludedProps = Event.allEvents.toList() << 'version' << 'dateCreated' << 'lastUpdated'
    persistentPropNames = domainClass.persistentProperties*.name
    boolean hasHibernate = pluginManager?.hasGrailsPlugin('hibernate')
    if (hasHibernate && org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsDomainBinder.getMapping(domainClass)?.identity?.generator == 'assigned') {
        persistentPropNames << domainClass.identifier.name
    }

DomainClassPropertyComparator mattsComparator = new DomainClassPropertyComparator(domainClass)
comparator = mattsComparator

props = domainClass.properties.findAll { persistentPropNames.contains(it.name) && !excludedProps.contains(it.name) }
    Collections.sort(props, comparator)
    for (p in props) {
        if (p.embedded) {
            def embeddedPropNames = p.component.persistentProperties*.name
            def embeddedProps = p.component.properties.findAll { embeddedPropNames.contains(it.name) && !excludedProps.contains(it.name) }
            Collections.sort(embeddedProps, comparator)
            %><fieldset class="embedded"><legend><g:message code="${domainClass.propertyName}.${p.name}.label" default="${p.naturalName}" /></legend><%
                for (ep in p.component.properties) {
                    renderFieldForProperty(ep, p.component, "${p.name}.")
                }
            %></fieldset><%
        } else {
            renderFieldForProperty(p, domainClass)
        }
    }

private renderFieldForProperty(p, owningClass, prefix = "") {
    boolean hasHibernate = pluginManager?.hasGrailsPlugin('hibernate')
    boolean display = true
    boolean required = false
    if (hasHibernate) {
        cp = owningClass.constrainedProperties[p.name]
        display = (cp ? cp.display : true)
        required = (cp ? !(cp.propertyType in [boolean, Boolean]) && !cp.nullable && (cp.propertyType != String || !cp.blank) : false)
    }
    if (display) { %>
<div class="fieldcontain \${hasErrors(bean: ${propertyName}, field: '${prefix}${p.name}', 'error')} ${required ? 'required' : ''}">
    <label for="${prefix}${p.name}">
        <g:message code="${domainClass.propertyName}.${prefix}${p.name}.label" default="${p.naturalName}" />
        <% if (required) { %><span class="required-indicator">*</span><% } %>
    </label>
    ${renderEditor(p)}
</div>
<%  }   } %>
于 2012-12-27T21:37:47.717 に答える
2

テンプレートの下の行にコメントを付けてビューを再生成すると、制約の順序がスキャフォールディングの順序になります。

//Collections.sort(props, comparator.constructors[0].newInstance([domainClass] as Object[]))
于 2014-02-12T18:24:05.497 に答える
0

制約は、説明したようにビューを更新する必要があります。実行してみてくださいgrails generate-all --stacktrace。それに応じてビューを更新する前に、スクリプトが終了する可能性があります。別の戦略は、問題が以下のステートメント内にあるかどうかを確認することです。そのため、それらを取り除き、それに応じてビューが更新されるかどうかを確認すると、問題の解決に近づく可能性があります。

static embedded = ['question']

List<Question> questions
static hasMany = [questions : Question]

お役に立てれば!

于 2012-11-26T12:31:33.027 に答える
0

いくつかのテストの後、休止状態プラグインなしで mongodb プラグインのみを使用すると、一部の足場機能が無効になることがわかりました。たとえば、ビューの生成中に制約句が省略されます。これを機能させるには、休止状態を使用する必要があります。したがって、コードを自動生成し、まだ mongodb を使用したい場合は、トリックがあります。hibernate でプロジェクトを作成、生成、終了し、本番用に hibernate をアンインストールして mongodb をインストールします。

于 2012-12-05T12:06:27.617 に答える