2011-12-27 67 views
0

我爲我的域類創建了一個靜態腳手架,併爲該域類獲得了一個控制器。控制器的create動作看起來像:爲什麼Grails的腳手架創建動作使用params?

def create() { 
    [userInstance: new User(params)] 
} 

我不知道爲什麼行:

[userInstance: new User(params)] 

已添加。很明顯,當create動作被調用時,不會有任何params - 那麼爲什麼會添加此行?

回答

6

顯然被調用create操作時,並且不會有任何params

不一定 - 試想一個情況下,你要在創建視圖的形式預先填充幾個字段。你可以使用:

/app/user/create?username=myusername 

會導致其中在視圖的userInstance具有形式顯示填充的用戶名字段。

2

還有可能是params,雖然一般不會有。

它允許預加載值,有時可能會有幫助,包括重新顯示創建表單。

+1

重新顯示創建表單的(例如,當出現驗證錯誤),通常是通過不同的動作(即'保存')在Grails中。但是,依賴於某人想要如何使用這些操作,仍然是一個有效的情況。 – 2011-12-27 16:09:46

+0

@RobHruska同意,我認爲預加載方案更可能。 – 2011-12-27 23:16:35

3

這從根本上來說是由Spring引發的,這個動作叫做'綁定',它是從一個jsp(本例中爲gsp)到一個對象的屬性並反之亦然的綁定表單元素的動作。

要將對象綁定到表單,那麼您應該先創建它,ypu如何綁定空對象?這是不可能的,這就是爲什麼新的ClassObject(...)

後,在Groovy中,我們有POGO的,和POGO的一個特點是與地圖初始化它們的能力,例如:

new User(name:'John',lastname:'Zuñiga') 

但是在這種情況下,這個'params'對象有一個小巧的魔法。這來自Groovy Servlets或Groovlets。你如何獲得一個從表單傳入的Java參數?那麼,與request.getParam("param_name"),但在這種情況下與Groovy你收到一個params對象,這個params對象是一張地圖,一個groovy地圖...嗯,一秒鐘...

如果Groovy中的POGO能夠接收Map作爲構造函數,而params對象是一個Map ...也許......哦,我可以把該地圖放在我的對象的構造函數中,並且在Spring之後用這個新對象綁定到窗體上,所以這個對象是在這個控制器的行動中旅行,所以它帶有填充的屬性。

我希望這個解釋很清楚,如果你有任何問題,我在這裏...... 問候

+0

+1好的解釋謝謝回答....;) – 2011-12-28 06:05:22