在grails中获取域上的特定实例

时间:2012-08-29 18:32:00

标签: grails

我有一个gsp文件调用这样的方法:

<g:link id="${child.id}" action="callChildProfile" controller="profile">${child.firstname}</g:link>

调用此方法

    def callChildProfile(Long id){

           childInstance = Child.get(id)
           System.out.println(childInstance.firstname + "  child instance")
           redirect(action:  "index")

   }

此方法将子实例设置为名为子实例的公共变量,但是当重定向发生时,该变量将被重置。 我重定向的原因是因为我想从这个控制器加载索引页。

索引如下:

        def index() {
        def messages = currentUserTimeline()
        [profileMessages: messages]
         System.out.println(childInstance + " child here")
        [childInstance : childInstance]
    } 

2 个答案:

答案 0 :(得分:2)

默认情况下,控制器是原型作用域,这意味着在调用ProfileController的请求和调用callChildProfile的请求之间使用的index实例会有所不同。因此,对象级别childInstance变量在请求之间不可用。

要在Child电话中使用index个实例,请查看chain方法:

callChildProfile(Long id){
    // do usual stuff
    chain(action:"index", model:[childInstance:childInstance])
}

def index() {
    // do other stuff
    [otherModelVar:"Some string"]
}

Map返回index后,系统会自动添加链式调用模型,因此childInstance中的callChildProfile将可用于gsp。< / p>

答案 1 :(得分:1)

控制器方法(动作)中的变量具有局部范围,因此,只能在该方法中使用。您应该从新实例传递id并使用该id来检索对象。

redirect action: "index", id: childInstance.id

和索引可能是

def index(Long id){
    childInstance = Child.get(id)

然后你可以得出结论,你不需要callChildProfile方法

或者你可以使用params

def index(){
    childInstance = Child.get(params.id)
    if(childInstance){
        doSomething()
    }
    else{
        createOrGetOrDoSomethingElse()
    }
}