2016-08-29 9 views
0

私はリスト画面でユーザーが作成をクリックすると、Webアプリケーションで作業しているので、いくつかの情報を入力しなければならないページに移動し、 2つのドメインのデータを入力する必要がありますが、データはまだテーブルに保存されていませんが、「作成」ボタンをクリックするとすべてがデータベースに格納されます。
I例を探していたが、何も見つけられなかった。 私はレコードを呼び出して編集する方法を知っています。すべてのドメインやテーブルがID番号を共有しているので、データを取得するために使用することができます。私の問題は、最初のgsp画面から別のインスタンスに転送するときです。インスタンスを保存してから、ユーザーが作成をクリックすると、データが3つのテーブルに移動します。2つのgspスクリーンをグレイの3つのドメインに接続

どうすればいいですか?私はまだ初心者で、勉強しようとしています

+0

何らかの種類の追加パラメータでデータベースに保存し、バックグラウンドジョブを持っていて、5分以上アイドル状態になっているすべての 'not_finished'オブジェクトを削除できないのはなぜですか?!ユーザーのセッションは、オブジェクトIDをデータベースに保存します。 –

+0

jquery-uiタブの後に、さまざまなタブで構成され、1つのサブミットで返されると思うかもしれません。submit http://stackoverflow.com/questions/14468298/displaying-grails-domains-in-jquery-tabs – Vahid

答えて

0

あなたがしたいことが混乱しているように聞こえますが、私は完全に理解しているのか分かりません。あなたはページ全体を変更したいと思いますが、以前の回答を失うことはありませんから、そうですか?あなたがこれをやりたい理由がありますか?

私は最初のgspからコントローラにすべての情報を送り、 "セッション"(例:session.name = params.name、session.age = params.age)にすべてを保存し、他のgsp以降では、あなたはセッションからの情報とちょうど来た情報を得て、すべてを保存します。これはおそらく非常に良い解決策ではありませんが、これが私がこれを理解した唯一の方法です。 ...

:)

+0

はいセッションを使用することができますが、あまりにも多くのユーザーが同時にアプリケーションを使用している場合、これは多くのメモリをとるかもしれません。 最初のgspページでは、ユーザーはドメインの1つにデータを入力してから、ユーザーが2つ目のドメインに接続している2番目のgspページを埋めるまで、そして2番目のgsp画面でユーザーが作成をクリックするまで、データがまだ格納されないようにしたい。すべてのデータはデータベースに保存する必要があります。 セッションではなく別の方法があると思いますか? – Syrianrevo

0

ジャストアイデア、私が今までそれを使用していないが、私は私の現在のアプリケーションのダイアログフローを変更するには、将来のある日は以下となります。

Wouldn webflow-pluginの良い例ですか?

+0

私はそれを一度も使ったことはありませんが、私はそれを見てみよう – Syrianrevo

0

これはコマンドオブジェクトが使用される理由です。フォームに収集してから複数のドメインオブジェクトを「生成」したいデータの集まりがある場合はいつでも、これが方法です。

アイデアは、フォームに収集するすべての情報を持つ単一のクラスを作成することです。塗りつぶしたフォームデータをコントローラーの保存アクションに戻してポストします。このアクションは、コマンドオブジェクトの制約を使用してデータが完成したことを検証します。すべてに満足すれば、コマンドオブジェクトのデータを使用してドメインオブジェクトを作成/更新します。

Grailsのベストプラクティスであるコマンドオブジェクトの使用を考えます。ドメインオブジェクトでは困難なデータ内の関係を検索して検証するコマンドオブジェクトで、カスタム検証のサポートを提供することができます。コマンド・クラスには、新しいドメイン・オブジェクトまたは更新されたドメイン・オブジェクトを生成するファクトリ・メソッドを作成することが多く、ユニット・テストに非常に便利です。

詳細については、マニュアルの「Webレイヤー」の「コマンドオブジェクト」を参照してください。 Grails 2では、コマンドオブジェクトは@Validateableアノテーションを持つクラスであり、Grails 3では、Validate可能な特性を実装します。コマンドクラスをコントローラの内部クラスとして宣言すると、自動的に検証が可能になります。私たちは、内部クラスではなくsrc/groovyで宣言したいと思っています。なぜなら、コードをよく知っていない人が見つけやすいからです。

0

これらすべての回答の中で、あなたの答えはありますが、すべての正直なところでは、これはあなた自身の理解をはるかに超えていると思います。フォームタブ1で

http://code.runnable.com/UevQr3zfd_oaAAGn/jquery-ui-tabs

はあなたが次にあなたが2つのドメインを

Address 
Postcode 

を持っているタブ2で

Name 
Age 

を持っているとして、あなたはこの例を持っていると仮定すると

クラス

Class User { 
String name 
String age 
Address address 

} 

Class Address { 
    String address1 
    String postcode 
} 

のでユーザーは、名前、年齢を持っており、また、アドレスにバインドさアドレスはアドレス1と郵便番号

今お使いのコントローラのアクション

def save(MyBean bean) { 
    Address address = new Address(bean.loadAddress()).save() 

    User user = new User() 
    def userMap = bean.loadUser() 
    user.age=userMap.age 
    user.name=userMap.name 
    //The above object that got saved first 
    user.addresss=address 
    user.save() 

    render "hopefully this should have saved it as expected" 
} 

src/main/groovy/yourPackage/MyBean.groovy

package yourPackage 

import grails.validation.Validateable 

Class MyBean implements Validateable{ 

    String name 
    String age 
    Address address 
    String address1 
    String postcode 

    //Now declare your constraints like your domainClass add validator where required to add additional verification/validation to your objects sent back 

    //This will return all the objects required as a map to save address domain class 
    protected Map loadAddress() { 
    Map results=[:] 
    results.with { 
     address1=address1 
     postcode=postcode 
    } 
    return results 
    } 
    //this will return the user object 
    protected Map loadUser() { 
    Map results=[:] 
    results.with { 
     name=name 
     age=age      
    } 
    } 
} 
でを持っていながら、

その他のかなり複雑なバリデーション豆の例に: PhotosBeanCustomerChatBeanScheduleBaseBean

Other points of reference:

私は、これは周りにあなたの頭を取得するためにあなたにしばらく時間がかかることがあり初心者として考えるが、それは今

たくさん明らかになる提供されるものと期待して言うように

E2A これは本当に複雑です! jqueryタブの代わりに2つのgsp画面を持つことができます

これはあまり意味がありません。

2番目のgspにparamsを渡すだけの2つのアクションがありますか? paramsを確認する必要がアクション2ページ1から受信したんさ

だからpage2.gspで

def TestController { 

    def index() { 
    render view: page1 
    } 

    //where page 1 is the first form and submits to action2 
    //action2 picks up parmas from page1 
    def action2() { 
    render view: page2, model:[params:params] 
    } 
} 

あなたは、

<g:form action="action3"> 
<g:hiddenField name="originalName" value="${params.originalValue}"/> 
<g:hiddenField name="originalName2" value="${params.originalValue2}"/> 
<g:hiddenField name="originalName3" value="${params.originalValue3}"/> 

Then your actual form content 

このこの方法をやってに問題がありますか?そうであれば元のページまたはページ2をレンダリングする必要があります。

ページ2に送信されると、hiddenFieldsはエンドユーザーによって改ざんされる可能性があります。したがって、検証された内容は無効になる可能性があります。もう一度すべてを再検証する方法が必要です。

上記の検証メソッドを使用すると、単にvalidate()関数を呼び出すことができます。または、おそらくpage2から送信されたものと初期値のmd5チェックを作成することができます。

いずれにしても、検証を心配しておらず、それが動作することを確認したい場合は、上記の方法が最も簡単です。

は、私が代わりにjQueryのタブの2 GSP画面のPage1で

を持つことができるあなただけ<g:include action="page2">を行うと、最初の内の第二GSPが含まれるが、正直なところでは1ページだけの1ページ内の両方のアクションが含まれている可能性ができます。これはなぜ意味がないのですか

+0

それは本当に複雑です! jqueryタブの代わりに2つのgspスクリーンを使用できますか? – Syrianrevo

+0

私は私の答えを更新しました – Vahid

関連する問題