2017-01-10 11 views
0

Paramデータをビューからコントローラに渡そうとしていますが、問題があります。ここで私が現在やろうとしていることがあります。Grails - ビューからコントローラにデータを渡す

ビュー:

<form action="${doStuffURL}" method='post' params="[keyId: ${mykey.id[i]}]"><g:actionSubmit value="doStuff"/></form> 

コントローラー:

def myObjectService //inject service object 

def doStuff = { 
    myObjectService.doStuff("${params.keyId}") //this blows up because it's value of NULL 
    myObjectService.doStuff(8)     //this works fine 
} 

エラー・ログが法MyObject.doStuff()のない署名が、引数の型には適用されません」と言うので、それはメソッドブロックに取得します。値: [ヌル]。"また、$ {mykey.id [i]}のデータを別のフィールドから見ることができるので、データは間違いなく表示されます。

コントローラにParamデータを読み込ませるにはどうすればよいですか?

ありがとうございます!

+0

を使用して再度試して、持っています'myKey.id [i]'の値が返ってきたことを確認しましたか? – Gregg

+0

はい、ちょうどChromeで検査して、データがあることを確認しました - params = "[keyId:8]" – gibsonsg

+0

私は自分の投稿を読むべきです。 .. myObjectService.doStuff( "$ {params.keyId}")宣言の大きな違いは小文字で、すべての違いがあります – Vahid

答えて

0

ここで間違って多くを誤る:

<form action="${doStuffURL}" method='post' params="[keyId: ${mykey.id[i]}]"><g:actionSubmit value="doStuff"/></form> 

使用しない理由:

<g:form name="something" controller="yourController" action="youraction">

をあなたは フォームのURLを生成するために持っている上で見ることができるように(多分あなたはあなたの理由を持っている)

コントローラ:

def doStuff = { 
    MyObject.doStuff("${params.keyId}") 
} 

Differences between action and methods in Grails controllers

だから、まず、なぜあなたは、コントローラを変更する必要がありますが、私の実際の懸念はここ MyObject.doStuff

あるMyObject.doStuff静的メソッドですか?

これは、このような呼び出しがwould workの場合にのみ発生します。リンクには静的メソッドが表示されます。 hereと呼ばれ、executor.registerSenderFaultによって生成されているためにあなたを混乱させるかもしれません - 拡張性 - 同じことをする将来のクラスのために。これはEmailExecutor.registerSenderFaultでした。あなたが宣言したように、大文字のフルクラスです。

確かに小文字で始まるサービス通知である必要があります。

myObjectServive.doStuff(stuff)

上記の場合はMyObjectでいくつかの本当の方法であるとstatic方法ではありません、あなたは、クラスに

MyObject myObject = new MyObject() 
myObject.doStuff(stuff) 

instantiateする必要がありますが、サービスは、それはすべてそこにある存在する理由要するに、これはあります彼らはちょうど注射されて以来、あなたのすべての面倒を保存します。

私は個人的に私はそれが上記編集されたコメントのいずれかであるとは思わない

def doStuff = { 
     println "my params are $params " 
     //do you see keyId in there ? 
     //if so what is doStuff expecting as input a string ?: 

     // since if you do 
     println "${params.keyId.getClass()}" 
     //by default it will be a string you may need to change it from: 
     //myObjectService.doStuff("${params.keyId}") 
     myObjectService.doStuff(params.keyId as Long) 
    } 

、それはまだあなたが何であるかをどのように/に関し、あなたには、いくつかの読書はE2A周り

を探してください示唆注射する。私は同様の問題を見てきました。私はあなたが新しいサービスを作り、新しいサービスをテストとして注入して再開することをお勧めします - あなたがそれを正しく注入していないと確信していないか、サービスが通常のサービスではなくabstract classかもしれません。それとも....あなたが作成している可能性がありので、サービス名の大文字/小文字の宣言で同様の間違いのいくつかのフォームを作っています....

MyObjectnameServiceをし、それらのかにNmyObjectNameService差を利用して、それを呼び出しても、実際のサービスはmyObjectNameServiceという小文字で作成されています。

テスト、これはすべて再びはるかに簡単な命名規則を使用して、テスト

grails create service MyService 

として新しいサービスを作成し、ページのレンダリング後にあなたがHTMLソースを表示すると、このサービス

+0

MyObjectはコードの前に挿入して表示していないサービスです。このサービスには、値を取り込むdoStuff(int id)というメソッドがあります。私はコントローラの値をハードコーディングするときに動作させることができました。 – gibsonsg

+0

'MyObject'はdef myObjectServiceとなるサービスではなく、' Service'という単語を含み、小文字の 'm'で始まります。 Serviceフォルダに入れてもサービスの言葉なしでもサービスの言葉ではありません – Vahid

+0

私は実際のオブジェクト名を書くのではなく、単純なものを作り上げています。私のオブジェクトは小文字で始まり、「サービス」で終わります。私はもっ​​と正確だったはずです。混乱させて申し訳ありません。しかし、それは間違いなくサービスです。私は元の投稿に調整を加えます。 – gibsonsg

関連する問題