2017-11-07 4 views
1

Grails 2.2.4でwi​​thFormを使用しようとしています 既存のgspファイルのフォームにuseToken = 'true'を追加しました。withFormがGrailsを使用してモデルデータをgspに渡さない2.2.4

しかし、関連するコントローラメソッドをwithForm {...} .invalidToken {response.status = 405}でラップすると、モデルからの属性が1つも受信されないためにgsp生成が失敗するため、内部サーバーエラーが発生します。

これを表示するために、実際のレンダーコードを、渡されたモデル属性の値を出力する簡単なステートメントに置き換えました。

私はwithFormラッパーを使用しないと、すべて正常に動作します。しかし、withFormがコンテンツをラップするとすぐに、モデル情報はもはや届きません。

私が間違っていることは何ですか?モデルをwithForm構文の下に置く必要がありますか?

コントローラコード:

def browse() { 
//  withForm { 
    def filter = null  
    def challenges = [] 
    def oimlChallenges = [] 
    def breadCrumbs 
    def total 
    def model = SystemUtil.baseModel(request) 
    def Boolean enablePartnerChallenge 
    def currentUser = springSecurityService?.currentUser 
    def source = params.source ?: 'innocentive' 
    model += [enablePartnerChallenge: enablePartnerChallenge, max: params.max ?: 10,] 
    filter = ChallengeFilter.build(params, sswcEnabled()) 
    model += [challenges: challenges, 
       filter: filter, total: total, sort: 'postedDate', 
       currentOffset: params.offset, source: source, 
       searchTerm: params.searchTerm, 
       userFilter: userFilter()] 

    render(view: 'browse', model: model) 
//  }.invalidToken{ response.status = 405} 
} 

GSPコード:

<body> 
    <g:render template="/panels/headerUX" 
    model="[selectedMenu: 'Challenge Center']" /> 
    <div class="body-container"> 
    <div class="container"> 
     <g:form name='filterForm' action="browse" id='filterForm' 
      method="post" useToken="true"> 

     browse.gsp values: 
     ${source.toString()} 
     ${pavilionId.toString()} 
     ${enablePartnerChallenge} 
     ${challengeListing.toString()} 
     ${pavilionTitle} 


<%--    <g:render template='browseTabsRefresh' model="${[source: source, pavilionId: pavilionId, enablePartnerChallenge: enablePartnerChallenge, challengeListing: challengeListing, pavilionTitle: pavilionTitle]}" />--%> 
<%--    <g:render template="newFilterPanel" model="${model}" />--%> 
<%--    <div id="challengeListDiv">--%> 
<%--     <g:render template='challengeListRefresh'--%> 
<%--      model="${[challenges:challenges, filter:filter, userFilter: userFilter, challengeListing:challengeListing]}" />--%> 
<%--    </div>--%> 

     </g:form> 
    </div> 
</div> 

<g:render template="/panels/footerUX" /> 

withForm無し印刷結果: browse.gsp値:innocentiveヌルヌルwithFormを用い

印刷結果: browse.gsp値:null null null

オリジナルに値 'innocentive'が含まれていて、現在はnullになっていることに注目してください。

答えて

1

そのGSPコードはbrowse.gspに表示されていますか?実際にフォームを送信せずにbrowseメソッドにアクセスしているかのように見えます。フォームを送信しない限り、invalidToken部分だけが実行され、後で(HTTPレスポンスコードを変更するだけですが、テキストや別の.gspをリダイレクトまたはレンダリングしないので)browse.gspをレンダリングしようとします。

は、確認してください、それはあなたの本当の実現のために.gspに

}.invalidToken{ 
      render(status: 405, text: "Invalid Token") 
} 

を試してみて、レンダリングされませんので、以下のようなもので、あなたのinvalidTokenブロックを交換するには、エラーページにリダイレクトしたいと思いますか似たような。

+1

はい、問題はフォームとメソッドの不一致でした。私は無作為に最初の更新を行うためのフォームを選んだ。残念ながら、私が選択したものは異常に動作し、メソッドはフォームデータの有無にかかわらず処理されます。それが働いたので、それは問題であると私には起こりませんでした。慣習に従った「標準」フォームを更新したとき、withFormは正常に動作しました。このような明確な説明をありがとう! –

関連する問題