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

时间:2017-01-18 08:48:00

标签: grails parameter-passing

我有一个具体的问题;

我是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:each中添加cars / index.gsp这个链接;

<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>

并修改了注册控制器;

 def index(Integer max) {
        params.max = Math.min(max ?: 10, 100)
        respond Car.list(params), model:[carCount: Car.count()]
    }

现在发生了什么;当我点击租借按钮页面重定向到注册/创建页面时,汽车用户选择了捕获ID;

这是我的注册/ 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>

当填写你的名字字段并点击保存按钮时,一切都很好,所以喜欢它工作但不是:)

因为当我检查我的数据库时,我没有看到选择的车辆ID。

mysql> SELECT * FROM registration;
+----+---------+--------------+
| id | version | your_name    |
+----+---------+--------------+
| 12 |       0 | Cihan Zengin |
| 13 |       0 | Cihan        |
| 14 |       0 | ndlkdkldnkl  |
+----+---------+--------------+

但是当我点击注册/索引或注册/显示时,只有你的名字价值,但我想看到那里的车:也是。

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

1 个答案:

答案 0 :(得分:0)

让我们假设每次注册时,每辆车只有一辆车和一个人。

首先,对于注册类:

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>

action="create"controller="registration"表示create()中的方法registrationController将被调用,如果找到或未找到,则会显示registration / create.gsp。在registrationController中,我不确定你的索引方法是什么,但只需添加:

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()
}

然后,在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中的隐藏字段确保在提交表单时将car id传递给控制器​​。因此,当单击submitButton时,将调用Registration Controller中的save()方法,并保存带有检索到的Car Object的Registration对象。

我们在这里做了很多不好的做法,但它应该有效。如果这还不清楚,请告诉我。)