2012-06-22 167 views
1

我正在編寫一個Grails應用程序,我希望設置一個允許用戶輸入圖像ID號的表單,並將此值傳遞給從S3中檢索圖像的控制器/操作對於給定的圖像ID。Grails表單和URL映射

所需的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?

謝謝!

回答

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

將生成一個HTML表單,其操作URL爲/results(控制器命名爲「results」的反向URL映射,不含操作或ID)。當提交此表單時,瀏覽器將在此URL的末尾添加?id=1234,因爲表單方法爲GET。這不是您可以在服務器端的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映射時,它將優先於廣義映射。 Grails會在使用更通用的匹配之前嘗試識別最佳匹配 - 技術上來說,具有較少通配符的映射將優先於具有較多通配符的映射。閱讀更多細節http://grails.1312388.n4.nabble.com/URL-Mapping-question-td3556768.html#a3565451 –

+0

你說得對@sudhir。 –

+0

你的第二點應該明確地解決問題。鑑於他有正確的網址映射 –

1

德里克,

你看到的是正確的行爲。對於GET請求你的要求

  • 參數兩件事情

    1. URL

    參數使用進行urlencode的URL後追加和&分開的,所以,當你有形式與URL http://mydomain.com/controller/action/ ,在這種形式下,你有兩個字段:id,name,然後,在提交後,他們將像這樣傳遞:http://mydomain.com/controller/action/?id=3&name=someName

    URLMappings are mappin只有它的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