2011-12-27 65 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