2011-09-21 61 views
1

我正在Grails(1.3.7)中開發基於組的Web應用程序,並且我擁有的其中一個字段是groupUrl,用於我的組域。其背後的理論是我想給用戶瀏覽到http://www.myapp.com/ {} userDefinedgroupUrl能力試圖讓羣組能夠在Grails中擁有自己的URL。 (類似於您可以如何瀏覽至facebook.com/{username})

我也希望能夠有www.myapp.com/{userDefinedGroupUrl}/$action?/$id?但是,現在我已經實現了它的實現方式,所以我必須將所有其他控制器硬編碼到映射中,以便它們首先匹配並正確執行。

現在,我把它的東西那樣工作

mappings = { 
    "/group/$action?/$id?"(controller:"group") 
    "/user/$action?/$id?"(controller: "user") 
    etc.. 
    "/$groupUrl?/$action?/$id?"(controller: "group") 
    "/$groupUrl?/events/$action?/id?"(controller: "groupEvents") 
} 

我認爲它實際上是現在工作的權利(我沒有測試它也確實能),但我不知道是否有一個更好的,更有效的方式來完成這一點。

任何意見,將不勝感激。

謝謝。

+0

你正在做的是正確的做法。 – hvgotcodes

+0

因此,在終於找到一些時間來玩這個遊戲之後,我最終保持了原來發布的方式,並將所有控制器硬編碼到了映射中。我不想在URL中包含「/ g」,並嘗試使用通配符映射,但沒有成功。我認爲現在不會那麼糟糕,所有我的控制器都在那裏,我只需要記住在添加新控制器時添加條目。主要工作(預期)是相應地調整我的操作/過濾器/視圖以強制URL結構。謝謝大家的反饋! – matr07

回答

4

首先,它可能是更好的把所有的組下的子路徑,這使得管理控制器輕鬆了很多,像這樣:

mappings = { 
    "/$controller/$action?/$id?"() 
    "/g/$groupUrl?/$action?/$id?"(controller: "group") 
    "/g/$groupUrl?/events/$action?/id?"(controller: "groupEvents") 
} 

二,Grails的URL Mappings允許動態控制器和行動,所以你可以使用一些代碼來選擇正確的控制器,就像這樣:

mappings = { 
    "/$controller/$action?/$id?"() 
    "/g/$groupUrl/$group_c?/$action?/$id?" { 
     controller = { 
      (params.group_c in [null, '', 'group']) ? 
       'group' : 
       'group' + params.group_c.capitalize() 
     } 

    } 
} 

這不是完美的,但基本上它允許下列網址:

  • /克/ MYGROUP/- > GroupController.index
  • /克/ MYGROUP /組/視圖/ 45 - > GroupController.view
  • /克/ MYGROUP /事件/列表/ 64 - > GroupEventController.list

這不,但是,允許GroupController行動沒有/group/路徑來表示。您可以通過硬編碼GroupController上的一系列操作來解決此問題,並且如果group_c位於該列表中,則將group_c更改爲action並將action更改爲id。那會很醜陋。

+0

另外,如果你不想用'/ g /'作爲斜槓,你可以嵌入一個前綴,並使用[通配符映射](http://grails.org/doc/latest/guide/6 。%20The%20Web%20Layer.html#6.4.6%20Mapping%20Wildcards) – OverZealous

+0

''group'+ params.group_c.capitalize()'可能更易於閱讀;-) –

+0

@tim_yates Doh!我搜索,但很快找不到一個。謝謝 - 我會馬上更新。 – OverZealous

相關問題