1

ユーザーが画像ID番号を入力できるフォームを設定したい、Grailsアプリを作成しています。この値は、指定された画像IDのS3から画像を取得するコントローラー/アクションに渡されます。

目的のURLはexample.com/results/1234の形式になります。次のURLマッピングを設定しました。

class UrlMappings {

    static mappings = {
        "/$controller/$action?/$id?"{
            constraints {
                // apply constraints here
            }
        }

        "/results/$id?" {
            controller = "s3Image"
            action = "getS3Image"
        }

        "/"(view:"/index")
        "500"(view:'/error')
    }
}

フォームの設定方法は次のとおりです。

<g:form  controller="results" method="get">
    <input type="text" name="id" class="input-xxlarge" placeholder="http://www.example.com">
      <button class="btn btn-inverse">Submit</button>
</g:form> 

ただし、これはフォームをexample.com/results?id=12345に送信するようです。

フォームの送信後に目的のURLを生成できるように、フォームまたはマッピングを変更するにはどうすればよいですか?

ありがとう!

4

4 に答える 4

4
<g:form  controller="results" method="get">

アクションURLが/results(アクションまたはIDのない「results」という名前のコントローラーの逆URLマッピング)であるHTMLフォームを生成します。このフォームが送信されると、フォームメソッドがGETであるため、ブラウザはこのURLの末尾に追加します。?id=1234これは、サーバー側のURLマッピングに影響を与えることができるものではありません。

代わりに、アクションにリダイレクトする別のコントローラーアクションにフォームPOSTを設定する必要がありますgetS3Image。リダイレクトはサーバー側のIDにアクセスできるため、リダイレクト用の見栄えの良いURLを生成できます。

UrlMappings:

"/results/$id?" {
    controller = "s3Image"
    action = "getS3Image"
}

"/findImage" {
    controller = "s3Image"
    action = "find"
}

S3ImageController:

def find() {
    redirect(action:"getS3Image", id:params.id)
}

def getS3Image() {
    // as before
}

GSP:

<g:form  controller="s3Image" action="find" method="post">
    <input type="text" name="id" class="input-xxlarge" placeholder="http://www.example.com">
      <button class="btn btn-inverse">Submit</button>
</g:form>
于 2012-06-23T10:07:32.513 に答える
1

デレク、

あなたが見ているのは正しい行動です。GETリクエストには、2つのことがあります

  1. リクエストのURL
  2. パラメーター

パラメータは、urlencodeを使用してURLの後に追加され、&で区切られます。したがって、URL http://mydomain.com/controller/action/のフォームがある場合、このフォームには、id、name、および送信時の2つのフィールドがあります。 、次のように渡されます: http://mydomain.com/controller/action/?id=3 &name=someName

URLMappingsは、その一部のURLのみをマッピングしています。したがって、この例では、UrlMappingは/ results /にのみ一致し、idは渡されません。

ただし、コントローラーのidパラメーターには引き続きアクセスできるため、次のように実行します(s3Imageコントローラー内)。

def getS3Image() {
     def id = params.id
}
于 2012-06-22T08:33:51.410 に答える
0

ここで2つの問題があると思います。まず、UrlMappingsルールは、表示順に上から下に一致します。grailsが一致する最初のルールはです"/$controller/$action?/$id?"。ルールを上に移動すると、ルール"/results/$id?"が優先されます。-投稿の下のコメントを確認してください

2番目の間違いはフォームの宣言です。私はあなたが意味したと思います:

<g:form controller="s3Image" method="getS3Image">
于 2012-06-22T07:59:40.627 に答える
0

UrlMappingで非常に簡単な変更を試してください。

"/results/$id?" {
    controller = "s3Image"
    action = "getS3Image"
    id = $id
}

次に、s3Imageコントローラーで次の方法でIDにアクセスできることを確認します。

def id = params.id
于 2012-06-22T09:06:48.833 に答える