2012-06-22 3 views
1

사용자가 이미지 ID 번호를 입력 할 수있는 형식을 설정하고이 값이 S3에서 이미지를 가져 오는 컨트롤러/액션으로 전달되는 Grails 앱을 작성 중입니다. 주어진 이미지 ID에 대해.Grails 폼과 URL 매핑

원하는 URL의 형식은 example.com/results/1234입니다. 나는 다음과 같은 URL 매핑 설정을 가지고 :

<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에 양식을 제출하는 것 같다

class UrlMappings { 

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

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

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

다음은 내가 설정에게 양식을 가지고하는 방법입니다.

양식 제출 후 원하는 URL을 생성 할 수 있도록 양식이나 매핑을 어떻게 변경합니까?

감사합니다.

답변

3
,719을

은 조치 URL이 /results 인 HTML 양식을 생성합니다 (조치 또는 ID가없는 "결과"라는 제어기의 역 URL 맵핑).이 양식을 제출하면 양식 메서드가 GET이므로 브라우저의?id=1234을이 URL 끝에 추가합니다. 이것은 서버 측의 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> 
+0

늦게 응답 해 주셔서 감사합니다. 이것은 내가 성취하려고했던 것입니다. –

0

여기 두 가지 문제가 있다고 생각합니다. 첫째, UrlMappings 규칙은 위에서 아래로 나타나는 순서대로 매치됩니다. grails와 일치하는 첫 번째 규칙은 "/$controller/$action?/$id?"입니다. 위의 규칙 "/results/$id?"을 이동하면 우선 적용됩니다. - 아래의 덧글을 확인하십시오..

두 번째 실수는 양식 신고입니다. 나는 당신이 의미하는 것 같아요 :

<g:form controller="s3Image" method="getS3Image"> 
+1

? 귀하의 첫 번째 요점에 동의하지 않습니다 - 컨트롤러에 대한 명시적인 URL 매핑이 있으면 일반화 된 URL보다 우선합니다. Grails는 좀 더 일반화 된 것을 사용하기 전에 가장 잘 일치하는 것을 식별하려고 시도합니다. -보다 기술적으로 와일드 카드가 적은 매핑이 더 많은 와일드 카드를 갖는 매핑보다 우선합니다. 자세한 내용을 보려면 http://grails.1312388.n4.nabble.com/URL-Mapping-question-td3556768.html#a3565451 –

+0

당신은 맞습니다 @ udhir. –

+0

두 번째 요점은 확실히 문제를 해결해야합니다. 감안할 때 그는 적절한 URL 매핑을 가지고 있습니다. –

1

데릭,

당신이보고있는 것은 올바른 행동입니다. GET 요청의 경우에는 요청

  • 매개 변수의 두 가지

    1. URL을
    당신이 URL http://mydomain.com/controller/action/형태이있을 때

    매개 변수,를 urlencode를 사용하여 URL 후 추가 및 &로 구분, 그렇게된다 이 양식에는 id, name이라는 두 개의 필드가 있습니다. 제출시 다음과 같이 전달됩니다. http://mydomain.com/controller/action/?id=3&name=someName

    URL 매핑이 mappin입니다. g URL 부분 만. 따라서 귀하의 예에서 UrlMapping은/results /에만 매치되며 id는 전달되지 않습니다.

    그러나 그것은 여전히 ​​컨트롤러 id 매개 변수에 액세스 할 수 있기 때문에, 단지 (s3Image 컨트롤러 내부)과 같이 그것을 할, 괜찮 :

    def getS3Image() { 
        def id = params.id 
    } 
    
  • 0

    는 UrlMapping 매우 간단한 변경을 시도해보십시오

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

    다음 확실히 당신은을 통해 s3Image 컨트롤러에 액세스 할 수있는 ID를 가지고

    def id = params.id