2013-02-07 60 views
2

我對Grails很新,儘管我在使用其他不同語言(Perl,Python,Ruby)的mvc框架開發web應用方面有很多經驗。Grails REST CRUD控制器方法

我想了解CRUD在grails中的含義。

基本上Grails的用於創建函數創建了由缺省以下兩種方法:

創建,其被用於顯示的形式來創建 保存,其用於保存所張貼的形式

現在來從不同的框架我習慣只有一種創建方法:

創建,如果請求方法是GET,此函數將顯示錶單,如果請求方法是POST,則保存表單,這似乎是優先方式大多數框架?!?!?

爲什麼Grails爲此功能提供了完全不同的方法?我知道我可以用手改變它,但是這樣做會產生什麼影響?我會放鬆什麼,我會得到什麼。

我知道這是不是一個很具體的問題,我肯定不希望啓動一個火焰戰爭,但我想知道爲什麼要選擇其他的方式之一...提前

謝謝您ansers。

+0

http:// stackoverflow。com/faq#dontask – Gregg

回答

3

generate-controllergenerate-all生成的代碼只是一個方便和建議做什麼。它會生成到您的應用程序中,因此可以根據需要進行編輯,或者根據需要從頭開始編寫所有內容。

替代的create行動接受GET請求,只是創建一個新的實例,並呈現GSP創建一個實例,再加上save行動只接受POST請求,並進行實際創作如果實例是單create這兩種方法:

def create() { 
    if (request.post) { 
     // persist the new instance 
    } 
    else { 
     // render the GSP 
    } 
} 

這需要明確的邏輯來確定做什麼,哪些混亂的代碼。 Grails採取的方法更清潔,因爲每個操作都更專注,只做一件事。這有助於簡化測試。

如果您發現兩個操作之間存在共享邏輯,您總是可以將它重構爲可以同時調用的私有方法。

+0

是的,我明白這一點,但問題是,如果我這樣做,除了代碼更混亂一些,也可以修復,我該怎麼辦? 特別注意使用類似於Backbone.js或ExtJS的JavaScript庫,它似乎使用get/post方法... 單獨創建/保存方法的缺點是,您必須以某種方式禁止GET請求保存操作... – PWFraley

+2

禁止GET請求到'save'操作是一種安全防範措施。有些情況下,允許通過GET刪除的應用程序被搜索引擎抓取,數據丟失。 –

+0

不僅如此,在現代瀏覽器中使用預取URL的時候,你會得到一些奇怪的行爲...... – PWFraley

7

當您生成控制器時,它會使用{index,list,create,save,show,edit,update,delete}操作的一些默認模板。這只是一個起點,或者僅供參考。

我通常爲面向公衆的應用程序所做的工作是設置處理基於HTTP方法的路由的URL映射。詳情請參閱http://grails.org/doc/latest/guide/theWebLayer.html#mappingHTTP

基本上,這可以讓你做這樣的事情:

static mappings = { 
    "/product/$id"(controller:"product") { 
     action = [GET:"show", PUT:"update", DELETE:"delete", POST:"save"] 
    } 
} 

在一個控制器,因爲它們服務於不同目的的行動應該是分開的。 Grails允許您設置URL映射來處理HTTP方法路由。

+0

這是一個不錯的想法,但是你如何區別show,它將顯示請求的對象並顯示該對象的可編輯版本,意味着包含所有可編輯字段的表單? – PWFraley

+0

如您所述,Grails生成兩個不同的控制器動作,一個用於顯示資源「show」,另一個用於顯示使用HTTP GET方法編輯資源的編輯表單。 –

+0

沒有什麼能阻止你在節目視圖中將兩者結合在一起。 –