1

そのため、フォーム付きの gsp があり、フォーム フィールドを検証するときに Twitter 検証状態を使用しようとしています。検証のために grails コマンド オブジェクトを使用しています。問題は、「 ${hasErrors(bean:validationCommand, field:'start', 'error')}」を使用して、コマンド オブジェクトのフィールドにエラーがある場合、grails が「エラー」クラスをコントロール グループに追加する方法を提供することです。 . これにより、フィールド「start」に検証エラーがある場合にエラー タグが追加されます。これは、ある程度まではうまく機能します。そのため、検証エラーが発生すると開始フィールドが赤くなります。しかし、検証の成功でも緑色に変わりたいです! これは起こっていません。

したがって、ここに開始フォームフィールドがあります:

 <div 
class="control-group ${hasErrors(bean:validationCommand, field:'start', 'error')}">
                    <label class="control-label" for="start">Starting Tag</label>
                    <div class="controls">
                        <g:textField name="start"
                            value="${fieldValue(bean:validationCommand,field:'start')}"
                            class="input-medium " />
                        <g:hasErrors bean="${validationCommand}" field="start">
                            <ul>
                                <span class="help-inline"> <g:renderErrors
                                        bean="${validationCommand}" field="start" as="list" />
                                </span>
                            </ul>
                        </g:hasErrors>
                    </div>
                </div>

これを設定する 1 つの方法は、テストを使用してフィールドにエラーがあるかどうかを確認し、変数 (startState など) を成功またはエラーに設定してから、div で ${startState} クラスを使用することです。

<g:if test="${ hasErrors(bean:validationCommand, field:'start') }">
                    <g:set var="startState" value="error"/>
                </g:if>
                <g:else>
                    <g:set var="startState" value="success"/>
                </g:else>
                </g:if>
                <div
                    class="control-group ${startState}">
                    <--same gsp as above-->

これが行うことは、フィールドが最初から緑色であり (テキスト フィールドに何も入力されていない場合でも)、エラーが発生すると赤色になるか、緑色のままになることです。

この作業を行うための最後の試みには、フィールドが設定されているかどうかを確認するための別の if テストが含まれていました

<g:if test="${fieldValue(bean:validationCommand,field:'start') != null }">

これは、2 回目の試行の結果には影響しません。

問題は、入力フィールドの検証に基づいて成功クラスを div タグに動的に追加するにはどうすればよいかということです。

編集 :

コントローラーを以下に示します。

class ValidationController {

def index() {
}

def validate(ValidationCommand cmd) {
    if (cmd.hasErrors()) {
        render view: 'index', model: [validationCommand: cmd]
    } else {
        try {
            SourceLocation repo = SourceLocation.findById(cmd.repo)
            def parentJira = cmd.issueService.findIssue(cmd.jira)

            Collection<IssueViewModel> issues = cmd.issueService.listIssuesForParent(cmd.jira)
            Collection<SourceCommitViewModel> commits = cmd.sourceRepositoryService.listCommits(repo.project, repo.slug, cmd.start, cmd.end)

            def (valid, missing_linked_issues, missing_mentioned_issues, bad_commits, issues_with_filtered_commits) = cmd.validationService.validate(repo, issues, commits)
            [ParentJira: parentJira, Valid: valid, Commits: commits, Issues: issues, LinkedMissing: missing_linked_issues, MentionedMissing: missing_mentioned_issues, BadCommits: bad_commits, SourceCommitValidation: issues_with_filtered_commits]
        } catch (e) {
            log.error( "Validation Controller Error", e )
            flash.message = "validation.service.failed"
            flash.args = [e.message]
            flash.default = "Validation Service failed"
            redirect action: 'index', params: params
        }
    }
}
}

コマンド オブジェクトは次のとおりです。

class ValidationCommand {

def validationService
def sourceRepositoryService
def issueService

String jira
String repo
String start
String end

static constraints = {
    jira blank: false, nullable: false, matches: "[a-zA-Z]+-[0-9]+", validator: existsIssueAndIsARelease
    repo blank: false, nullable: false, validator: { val, obj -> SourceLocation.findById(val) != null }
    start blank: false, nullable: false, validator: existsTag
    end blank: false, nullable: false, validator: existsTag
}
}
4

1 に答える 1

0

あなたはここを見ることができます: Grails hasErrors method with ternary operator? 、しかしすぐに、 hasErrors(bean:validationCommand, field:'start') は期待どおりに動作しません(つまり、ブール値を返しません)。css-class 式で使用するためのものです。したがって、あなたの場合、そのためのタグを作成するか、簡単な回避策もあります(これは見栄えが悪いので、あまりお勧めしません)。 <g:if test="${ hasErrors(bean:validationCommand, field:'start', 'true') } == 'true'"> <g:set var="startState" value="error"/> </g:if> <g:else> <g:set var="startState" value="success"/> </g:else> <div class="control-group ${startState}">

于 2014-12-02T04:01:43.010 に答える