Grails - 自动填充字段,其客户记录名称称为创建预留

时间:2015-04-08 16:03:21

标签: grails

我正在与Grails建立预订/预订系统。

我有预订舱和客户舱。有一个(客户)到多个(预订)关系。我想确保只在客户展示视图中进行新的预订,因此我编辑了视图,使其成为您创建新预订的唯一位置。

这样做,创建预订表单也适用于客户和产品的下拉选择器。我可以这样预订,但我必须选择客户 - 我希望客户字段自动填充客户名称,点击新的预订按钮。

目前在我的_form.gsp(由预订create.gsp使用)中,我有以下行给出了上述选择功能

<g:select id="customer" name="customer.id" from="${net.kanootours.Customer.list()}" optionKey="id" required="" value="${reservationInstance?.customer?.id}" class="many-to-one"/>

我认为部分:value =“$ {reservationInstance?.customer?.id}”会将字段设置为当前客户的值,但不会(该字段只填充第一个客户名称)。

如何在客户字段中填写我正在调用新预订的客户记录的名称?如果不是g:select?

,在这种情况下使用的正确标签是什么?

对于最终结果,我只想在新预订中使用客户名称,而不需要将该名称更改为其他名称。

我曾尝试使用g:field和g:fieldValue,但无法使这些工作正常工作。

我还考虑过将客户ID作为调用g:link的参数发送的可能性 - 但我不知道如何处理它。


更新/解决方案:

下面的Greggs评论帮助我找到了解决方案,还有“GRAILS 2:快速入门指南”,Chpater“论坛消息和UI技巧”一书。

为了实现这一点,我添加了以下内容:

在预订_form.gsp:

<g:hiddenField name="customer.id" value="${customerInstance?.customer?.id}" />
<g:hiddenField name="customer.firstName" value="${customerInstance?.customer?.firstName}" />
<g:hiddenField name="customer.lastName" value="${customerInstance?.customer?.lastName}" />


N.B - I did not need all three - just the ID , but I used this for a better display title on the Reservation Create page.

我将客户显示页面(新预订链接)中的链接更改为:

<li><g:link controller="reservation" class="create" action="create" 
params='["customer.id":"${customerInstance?.id}","customer.firstName":"${customerInstance?.firstName}","customer.lastName":"${customerInstance?.lastName}"]'>New Reservation</g:link></li>

这是我遇到最多麻烦的部分,因为customer.id部分在我尝试将其放入params的每种格式中都抛出了大量错误。这是本书帮助我的地方,它指出它需要被“”包围,因为它有''。在参议院。一旦我发现了这一点,我就可以解决任何其他问题

我还添加了预订创建视图:

<h1><g:message code="default.create.label" args="[entityName]"  /> for ${reservationInstance?.customer?.firstName} ${reservationInstance?.customer?.lastName} ID: ${reservationInstance?.customer?.id}</h1>

我用它作为测试来确保正确传递的参数。然后,我可以确保将customer.id字段正确地发送到控制器中的create操作。

为了实现我使用

<g:field type="text" name="customer.id"value="${reservationInstance?.customer?.id}" readonly="readonly"/>

1 个答案:

答案 0 :(得分:0)

我在这里做了一些猜测,因为我没有完全关注你的问题。因此,我的假设是您已进入客户屏幕,并且您想要单击新预订按钮并让客户已与所述预约相关联。如果这是真的,那么以下内容应该让你朝着正确的方向前进。

在客户表格上:

<g:link controller="reservation" action="create" params="[customer.id: customer.id]">Create Reservation</g:link>

这个RegistrationController

def create() {
   // params.customer.id will auto populate in this reservation instance
   def reservation = new Reservation(params)
   ...
} 

报名表:

<g:hiddenField name="customer.id" value="${reservation.customer.id" />
Customer Name: ${reservation.customer.name}

在上面的代码中,Customer将在Reservation对象中可用。然后,您将customer.id存储为隐藏字段,这样当您将此预留提交到RegistrationController.save()操作时,它将再次使用正确的客户ID自动填充预订。如果您需要在预订中存储有关客户的不同内容,则适用相同的技术。您只需要不断传递所有请求。