2016-10-20 8 views
1

ソート、検索、フィルタリングできるリストビューがあります。そのリストビューから、ユーザーは複数のステップでアイテムを編集できます。最後に、変更を編集してレビューした後、ユーザーはリストに戻ります。今度は、ユーザーが以前に設定したのと同じ並べ替え、検索用語とフィルタをリストに使用し、正しい結果を表示するようにします。後で使用するアクションのパラメータを保存する方法

リストアクションを表示するときに、複数のパラメータ(ソート、検索、フィルタ)を保存して再利用するにはどうすればよいですか?私が考え

可能な不満足な方法:

  • は、すべての必要なパラメータを通過します。 2つのリストアクション呼び出しの間に複数のアクションが含まれている場合、ほとんど機能しません。
  • セッションオブジェクトにパラメータを保存します。これは、(パラメータがアクションに渡されたかどうかを確認、新しい値を格納パラメータが渡されていない場合は、セッションから古いパラメータを取得し、空の文字列パラメータを扱う)複数のパラメータを処理するために多くのコードを必要としているようだ:

    Long longParameter 
    if(params.containsKey('longParameter')) { 
        longParameter = params.getLong('longParameter') 
        session.setAttribute('longParameter', longParameter) 
    } else { 
        longParameter = session.getAttribute('longParameter') as Long 
        params['longParameter'] = longParameter 
    } 
    

答えて

3

あなたがあなたの代わりにInterceptorを使用することができ、それがより一般的なようにしたい場合:ここでは、あなたのニーズに適合させることができるサンプルです。

これはおそらく、このように一般化することができます。

class SessionParamInterceptor { 
    SessionParamInterceptor() { 
     matchAll() // You could match only controllers that are relevant. 
    } 

    static final List<String> sessionParams = ['myParam','otherParam','coolParam'] 

    boolean before() { 
     sessionParams.each { 
      // If the request contains param, then set it in session 
      if (params.containsKey(it)) { 
       session[it] = params[it] 
      } else { 
       // Else, get the value from session (it will be null, if not present) 
       params[it] = session[it] 
      } 
     } 

     true 
    } 
} 

静的sessionParamsあなたはセッションから取得/保存するパラメータを保持しています。

paramsにリストの要素が含まれている場合は、同じ名前のsessionに格納されます。そうでない場合、それはsessionから取られます(存在すると仮定します)。

コントローラでは、いつものようにparams.getLong('theParam')にアクセスできるようになりました。 Grailsのパラメータ変換を使用することもできます:

def myAction(Long theParam) { 

} 

LOCが保存されました。

+0

私はコードを実行しているようですが、それはうまくいくようですが、私はそれを証明するためのテストケースを持っていません:-) – sbglasius

+0

Grails <3、同じ概念をGrailsフィルタで使用することができます – sbglasius

1

sessionを使用することが最適です。好みのときに優先度を保存するだけです。つまり、ユーザーが並べ替えたり、フィルタリングしたりするときは、その情報をに保存してください。具体的には、<controller>.<action>のページを返す前にしてください。次回はsessionをチェックし、それに関連するものがある場合は<controller>.<action>を適用します。それ以外の場合はデフォルトページをレンダリングします。

sbglasius, hereのように、これにはInterceptorを使用することをお勧めします。

私はあなたが私の要点を得ることを望みます。

+0

コード例を追加するために私の質問を編集しました。これはただ1つのパラメータのコードのように見えますが、私はしばしばそれらをたくさん持っています – deflomu

1

私もセッションを使用します。

def list() { 
    if (request.method == 'GET' && !request.queryString) { 
    if (session[controllerName]) { 
     // Recall params from memory 
     params.putAll(session[controllerName]) 
    } 
    } else { 
    // Save params to memory and redirect to get clean URL 
    session[controllerName] = extractParams(params) 
    redirect(action: actionName) 
    return 
    } 

    // Do your actions here... 
} 

def extractParams(params) { 
    def ret = [:] 
    params.each { entry -> 
    if (entry.key.startsWith("filter_") || entry.key == "max" || entry.key == "offset" || entry.key == "sort" || entry.key == "order") { 
     ret[entry.key] = entry.value 
    } 
    } 
    return ret 
} 
関連する問題