Grails 当用户将表单字段留空时,使用正确的参数重新呈现视图时出现问题

Grails 当用户将表单字段留空时,使用正确的参数重新呈现视图时出现问题,grails,groovy,Grails,Groovy,我正在为我的加载创建视图使用帐户字段的标记中的noSelection属性。当用户未进行选择并单击“创建”按钮时,我希望所有表单字段的当前值都会传递给我的Load控制器中的save闭包,该控制器反过来会重新调用Create视图,并用前面提到的当前值填充该视图。我的两个表单字段没有出现这种情况,我不清楚原因 以下是由/truckingmanagement/Load/create控制器调用的Loadcreate视图的外观: 如果用户没有在帐户字段中进行选择,然后继续单击“创建”按钮,则显然无法创建加

我正在为我的
加载
创建
视图使用
帐户
字段的
标记中的
noSelection
属性。当用户未进行选择并单击“创建”按钮时,我希望所有表单字段的当前值都会传递给我的
Load
控制器中的
save
闭包,该控制器反过来会重新调用
Create
视图,并用前面提到的当前值填充该视图。我的两个表单字段没有出现这种情况,我不清楚原因

以下是由
/truckingmanagement/Load/create
控制器调用的
Load
create
视图的外观:

如果用户没有在
帐户
字段中进行选择,然后继续单击“创建”按钮,则显然无法创建加载。以下是由
/truckingmanagement/Load/save
控制器调用的结果
加载
创建
视图的样子:

所以我这里有两个问题,第一个问题是第二个视图中的
Logged By
字段没有填充第一个视图中选择的值。此外,下拉框完全为空,没有用户可供选择。第二个问题是,
账户
字段下拉框完全为空,没有可供选择的账户。

以下是用于
加载
创建
视图中的
记录者
帐户
字段的
标记

记录人
字段:

<g:select name="loggedBy.id" from="${loggedByUsers}" optionKey="id"  value="${loadInstance?.loggedBy?.id}" />
<g:select id="account" name="account.id" from="${accountsWithCargoDestinations}" optionKey="id" noSelection="['':'-Select-']" />
以下是my
LoadController
中的
创建
保存
闭包:

def create = {
    Role role1 = Role.findByAuthority("ROLE_ADMIN")
    Role role2 = Role.findByAuthority("ROLE_OFFICE_PROFESSIONAL")
    Role role3 = Role.findByAuthority("ROLE_DRIVER")   
    def loggedByUsers = UserRole.findAllByRoleInList([role1, role2, role3]).user

    def loadInstance = new Load()
    loadInstance.properties = params

    def accountsWithCargoDestinations = Account.findAllByUserInList(Address.findAll("from Address as addresses where addresses.cargoDestination=true").user)

    return [loadInstance:loadInstance, loggedByUsers:loggedByUsers, accountsWithCargoDestinations:accountsWithCargoDestinations]
}

def save = {
    def loadInstance = new Load(params)
    if (loadInstance.save(flush: true)) {
        flash.message = "${message(code: 'default.created.message', args: [message(code: 'load.label', default: 'Load'), loadInstance.id])}"
        redirect(action: "show", id: loadInstance.id)
    }
    else {
        System.out.println params //Trying to see if any values from the problem fields got lost.
        render(view: "create", model: [loadInstance: loadInstance])
    }
}

您将在my
save
闭包的
else
部分的
println
语句中注意到,该语句打印出
参数。当我这样做时,我发现在第一个视图中的“记录者”字段中选择的值确实从第一个视图一直正确地传递到了这一点,但我不知道为什么在下一行代码中呈现“加载”
创建”
视图时不显示该值,或者至少不知道为什么会显示某些内容(即来自
卡车管理/装载/创建
控制器的
日志数据库用户
)在呈现视图时,不填充“日志记录者”字段。如果需要任何帮助,我们将不胜感激,并对其冗长表示歉意。

回答您在评论回复中提出的问题。您可能希望调查控制器中的使用情况。如果需要,您需要重新执行创建操作,以仅实例化一个新的loadInstance尚未出现在模型中。但是,这应该可以解决问题。

要回答您在评论回复中提出的问题,您可能需要调查控制器中的使用情况。您需要稍微重新执行创建操作,以便仅实例化模型中尚未出现的新loadInstance。但是,这应该可以解决问题

我可能在这里漏掉了一些简单的东西,但是你的错误返回的模型不是恰好漏掉了loggedByUsers和accountsWithCargoDestinations吗?@Joshua Moore,没有,你没有漏掉任何东西,但显然我漏掉了,因为这似乎已经修复了它。但是为了干净的代码,我如何/在哪里放置
loggedByUsers
accountsWithCargoDestinations
定义,这样我就不必在两个不同的闭包(即
创建
保存
闭包)中使用完全相同的代码了?我这样问是因为只需将映射放在我的
保存
闭包的模型中(如您所建议的)没有做到这一点,我不得不从
create
闭包中复制相关的代码。我可能在这里遗漏了一些简单的东西,但是你的错误返回的模型不是恰好遗漏了loggedByUsers和accountsWithCargoDestinations吗?@Joshua Moore,没有,你没有遗漏任何东西,但显然我遗漏了,因为这似乎有e修复了它。但是为了代码干净,我如何/在哪里放置
loggedByUsers
accountsWithCargoDestinations
定义,这样我就不必在两个不同的闭包(即
create
save
闭包)中使用完全相同的代码了?我这样问是因为我只是将映射放在我的
save
闭包的模型中(如您所建议的)没有做到这一点,我不得不从
create
闭包中复制相关代码。我阅读了
chain
方法,但实际上我选择了编写可重用服务的路线……似乎更适合。现在我可以在任何地方用一行代码调用我的服务。我会选择您的答案,因为您需要我会在评论中回答我的问题。再次感谢!我阅读了
chain
方法,但实际上我选择了编写可重用服务的方式……似乎更适合。现在我可以在任何地方用一行代码呼叫我的服务。我会选择你的答案,因为你在评论中回答了我的问题。谢谢再一次!