Grails-如何将参数从另一个控制器保存到控制器

Grails-如何将参数从另一个控制器保存到控制器,grails,parameter-passing,Grails,Parameter Passing,我有一个具体的问题 我是grails的新手,我正试图用这个场景编写一些测试应用程序 我有2个域类 1辆车 2-注册 我想添加一些品牌,型号等汽车和用户将选择从列表中一些汽车,并点击租车按钮。当用户点击租车按钮时,将打开注册/创建页面,我想获取用户选择的汽车的汽车:id,用户将输入自己的一些额外信息,如您的姓名,当用户点击注册/列表上的保存按钮时,我需要查看汽车:id和您的姓名输入的注册 在汽车类中,我有一个汽车列表,这个字段是我的汽车模型 package rentme class Car {

我有一个具体的问题

我是grails的新手,我正试图用这个场景编写一些测试应用程序

我有2个域类

1辆车 2-注册

我想添加一些品牌,型号等汽车和用户将选择从列表中一些汽车,并点击租车按钮。当用户点击租车按钮时,将打开注册/创建页面,我想获取用户选择的汽车的汽车:id,用户将输入自己的一些额外信息,如您的姓名,当用户点击注册/列表上的保存按钮时,我需要查看汽车:id和您的姓名输入的注册

在汽车类中,我有一个汽车列表,这个字段是我的汽车模型

package rentme

class Car {

    String brand
    String model
    String fuelType
    BigDecimal pricePerDay
    String busy

    static constraints = {
        brand(inList:["AUDI", "BMW", "MERCEDES", "NISSAN", "HONDA", "FORD"])
        model()
        fuelType(inList:["FUEL", "DIESEL", "AUTOGAS"])
        pricePerDay(min:0.0, max:1000.0)
        busy(inList:["YES", "NO"])

    }
}
我有注册课

package rentme

class Registration {

    String yourName



    static constraints = {
        yourName()
    }
}
所以我所做的

我在g中添加cars/index.gsp这个链接:each

<g:each in="${carList}" var="car">
                    <p>${car.id} </p>
                    <g:link action="create" controller="registration" params="${[car: car, carId : car.id ]}">
                        Rent Car
                    </g:link>

                </g:each>
现在发生了什么;当我点击“租车”按钮时,页面重定向到注册/创建页面,页面上显示的是用户选择的车号

这是我的注册/create.gsp

 <g:form action="save">
                <div><p>Car ID : ${car.id} </p></div>
                <fieldset class="form">
                    <f:all bean="registration"/>
                </fieldset>
                <fieldset class="buttons">
                    <g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" />
                </fieldset>
            </g:form>
但是,当我点击注册/索引或注册/显示时,只有您的姓名值,但我也想看到那里的car:id


怎么做?请有人告诉我,因为我不懂,在互联网上也找不到类似的东西

让我们假设每次登记,每个人只有一辆车

首先,对于注册类:

package rentme

class Registration {

    String yourName
    Car rentedCar

    static constraints = {
        yourName()
    }
}
正如你们所看到的,我在里面添加了Car,所以对于每个注册对象,都会有一个Car对象。在注册表的数据库中,将自动添加一个新列“CAR_ID”

接下来,对于cars/index.gsp各:

<g:each in="${carList}" var="car">
    <p>${car.id} </p>
    <g:link action="create" controller="registration" params="${[carId : car.id ]}">
        Rent Car
    </g:link>

</g:each>
然后,在registration/create.gsp中:

<g:form action="save">
    <div><p>Car ID : ${car.id} </p></div>
    <fieldset class="form">
        <f:all bean="registration"/>
    </fieldset>
    <fieldset class="buttons">
        <input type="hidden" name="carId" id="carId" value="${car?.id}"/>
        <input type="text" name="yourName" required>
        <g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" />
    </fieldset>
</g:form>
create方法从car/index.gsp获取carId的参数,并使用它获取car对象,并在registration/create.gsp中呈现

registration/create.gsp中的隐藏字段确保在提交表单时将车辆id传递给控制器。因此,单击submitButton时,将调用Registration Controller中的save方法,并保存带有检索到的Car对象的注册对象


我们在这里所做的有很多不好的做法,但它应该起作用。如果仍然不清楚,请告诉我:

不确定,但只需在注册类中添加汽车id就可以了。目前,注册类只包含名称,所以这就是您得到的。只需像字段一样添加吗?此时用户应该在注册/创建中再次选择汽车id我不想这样做,我想在注册/创建后保存注册类将保存我从汽车类传递的汽车id。您需要确定一个注册是否属于一辆汽车,或者一辆汽车是否属于一个注册。。。这是A车,我想把它登记给鲍勃。在这种情况下,登记可以说是属于汽车。因此,您需要在模型中使用注释来表示该事实,然后调整控制器和视图。阅读Grails/Gorm中关于hasOne和belongsTo的内容。@railsdog那么需要如何调整控制器和视图呢?你能告诉我详细的代码吗?最近有几个问题和你的问题相似。所以我不愿意编写代码,假设它是为了一个任务。将提问者指向参考文档要比编写代码好得多,否则你将如何学习?。这并不难,你只需要付出努力。给一个人一条鱼,他吃一晚上,教一个人钓鱼,他吃一辈子。我不确定其他人,但当时我什么都不知道,显示代码实际上比查看别人指出的参考更好更快。从你理解的角度理解某件事,然后再看参考文献,这确实有帮助。这是事实,但也有许多可用的资源提供了比单个问题(有时是狭窄问题)的答案更广泛的参考范围。查看grailsgenerate控制器、grailsgenerate视图或grailsgenerate所创建的内容,可以在很大程度上显示grails默认的约定优先于配置的透视图。然后你从那里扩展。@railsdog我是一个素食主义者,所以请为自己保存鱼:@Jay谢谢你,我从示例代码中更好地理解了你的说法,我尝试了你的方法,但得到了这个错误,URI/registration/create Class java.lang.NullPointerException消息请求处理失败;嵌套异常为org.grails.gsp.groovyPageSexException:处理GroovyPageView时出错:[views/registration/create.gsp:38]执行标记时出错:在第[29]行上计算表达式[car.id]时出错:由于无法获取null对象上的属性“id”,因此无法获取null对象上的属性“id”
<g:each in="${carList}" var="car">
    <p>${car.id} </p>
    <g:link action="create" controller="registration" params="${[carId : car.id ]}">
        Rent Car
    </g:link>

</g:each>
def create() {
    def selectedCar = Car.get(params.carId)

    [car: selectedCar]
}

def save() {
    def selectedCar = Car.get(params.carId)

    def registration = new Registration(
        yourName: params.yourName,
        car: selectedCar
    ).save()
}
<g:form action="save">
    <div><p>Car ID : ${car.id} </p></div>
    <fieldset class="form">
        <f:all bean="registration"/>
    </fieldset>
    <fieldset class="buttons">
        <input type="hidden" name="carId" id="carId" value="${car?.id}"/>
        <input type="text" name="yourName" required>
        <g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" />
    </fieldset>
</g:form>