2013-02-01 3 views
6

私は1つのドメインを持っていますが、そのドメインには25人以上のメンバーがいます。 このメンバーの値は1つのフォームから来ます。しかし、あまりにも多くのフィールドを埋めるのは悪いと感じています。だから私は入力フォームを別々の段階に分けると考えました。grailsサービスで永続性の範囲が異なる

私はすべての入力に必要なフィールドを持つFormObjectというクラスを作成しました。 この問題はページ間でこのオブジェクトを渡すことができません。

セッションの範囲を持つサービスでは、FormObjectへの参照を保持し、サービスからメソッドを呼び出して再度取得できると考えていた可能性があります。

<g:set var="formService" value="${new FormService()}" /> 

class FormService{ 
    static transactional = false 
    static scope = "session" 

    FormObject myObject = new FormObject() 

    def resetForm(){ 
     myObject=new FormObject() 
    } 

    def getForm(){ 
     return myObject 
    } 
} 

とデータがページの間保持されませんしかし

<g:set var="myForm" value="${formService.getForm()}" /> 

ようGSPにそれを使用。

私はmyObjectプロパティをstaticとして定義しても問題はありませんが、これがプロダクションをヒットすると、myObjectがすべてのユーザーに共有されることに心配しています。

誰かが私がそれを静的にしたらどうなるか確認できますか? 各セッションに静的なフォームオブジェクトがあるか、1つの静的なフォームオブジェクトしかないのでしょうか?私は解決策を持って

答えて

2

....

最初のアプローチは、あなたがのSpring Beanとしてそれを得るのではなく、新しいインスタンスを作成していることを除いて、近くにあるので、それはセッションスコープのISN」のだという事実遊びに来る。一般に、2ページ以上にわたるワークフローがある場合は、WebFlowを参照する必要がありますが、これは必要以上に大きなソリューションになる可能性があります。

サービスラッパーをスキップして、オブジェクトをセッションに格納するだけです。ここでのリスクは、何かが起きたときにオブジェクトを使ってセッションを汚染してしまい、それらを削除しないことになりますので、それを処理する必要があります。最初のコントローラのアクションで

は、オブジェクトがあることを確認してください。

def action1 = { 
    ... regular work 
    session.formObject = new FormObject() 
    // return model, e.g. 
    [foo: bar] 
} 

とのGSPであなたはそれを私はおそらく別のアプローチを取るとを通じてフォームオブジェクトを提供する

${session.formObject} 
+2

なぜあなたは他の人と話しているようにあなた自身の質問に答えていますか?笑。 – lucke84

+0

@ lucke84、この質問はgrails開発者にとって重要な知識です。 – sanghavi7

+0

あなたのソリューションを共有したことはいいことですが、なぜ「あなたはそれをこのようにしなければならないのですか」ではなく、「私はこのように解決しました」と言わなかったのでしょうか? – lucke84

1

を参照することができますコントローラーを介したモデル - すべての永続性の問題もコントローラーを介して行われるため、最初のアプローチは期待通りに機能します。

function showForm() { 
    render[view: 'view', model: [serviceForm: formService.form]] 
} 

function persistForm(MyCommand cmd) { 
    // check cmd for errors 
    if(cmd.hasErrors()) { 
    // return the MyCommand object for error yielding 
    render(view: 'view', model: [cmd: cmd]] 
    } 
    // persist cmd fields to formService.form object 
    formService.form.field = cmd.field 
} 

これは正常に動作するはずです

関連する問題