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