来自创建视图的表单值不会传递到保存视图

时间:2011-08-31 23:40:35

标签: grails groovy gorm

这个问题是我问here的问题的延伸/类似问题。我在这个问题上遇到的具体问题已经解决了,但我还有另外一个非常类似的问题。

问题是create视图中输入的“货物目的地”和“货物来源”值未显示在save视图中。例如,当用户忘记在create视图中输入必要的信息并按下“创建”按钮时,用户输入的值应显示在save视图中。发生此情况时,除“货物目的地”和“货物资源”外的所有字段都会显示在save视图中。

当我在println控制器中放置save语句时,我可以看到有问题的参数确实从save视图中传到create控制器

有问题的两个字段被链接到其他字段,并由一个AJAX填充,该AJAX转到Load控制器中的闭包。我相信这个闭包是我的问题所在,在render声明中:

def getAccountUserCargoDestinations = {
    if(params.id == ""){
        render g.select(name: 'cargoDestination.id')
        return
    }
    def user = Account.find("from Account as account where account.id=:id", [id:Long.valueOf(params.id)]).user
    def addresses = Address.find("from Address as addresses where addresses.user=:user and addresses.cargoDestination=true", [user:user])
    render g.select(optionKey: 'id', from: addresses,  name: 'cargoDestination.id')
}

如果那不是问题所在,那么它可能位于create视图本身的相应字段中:

<g:select name="cargoDestination.id" optionKey="id" value="${loadInstance?.cargoDestination?.id}" />

还有两件事:

1。)Grails没有给我任何错误

2。)cargoDestinationcargoSource都是我所做的Address课程的实例。

任何帮助都将不胜感激。

更新

继续寻找解决方案,我注意到了一些有趣的事情。首先,我将以下代码放在我的create视图中(由Load控制器中的create闭包呈现,并由Load Controller中的save闭包重新呈现将任何字段留空):

  <g:if test="${loadInstance?.cargoDestination?.id != null}">
    ${loadInstance?.cargoDestination}
  </g:if>

通过执行此操作,我可以看到当create闭包调用save视图时,该参数将一直显示到<g:if> tags to get the desired results, but that just seems messy, and I doubt that is the "correct" way to solve this problem. I also wrapped my AJAX in a similar视图。我想我可以使用tag to make sure it was not changing the field value when the closure rendered theview, and I can confirm that the AJAX is indeed not changing the field value. Other than the AJAX, the only thing different about my problem fields is that I do not have a个标签中保存attribute in their corresponding创建{{1}}(我在此问题中最初发布的代码可以看到) 。我知道解决方案很简单......我在这里缺少什么?

2 个答案:

答案 0 :(得分:0)

  

有问题的两个字段被链接到其他字段并填充   通过AJAX进入Load控制器的闭包。

HM。对象是否保存在两者之间?它读起来好像是

  • 数据被发送到save控制器,因为缺少字段而无法保存
  • 保存控制器显示save视图和println字段(可供控制器使用)
  • 视图调用load控制器,该控制器尝试从尚未保存的对象中检索两个字段。没有与save控制器的中间请求数据的连接。

如果不是这个问题,我猜你必须发布更多代码才能分析你的问题。

HM。刚刚看了你的另一个问题。我认为Ajax load控制器无法获取数据,因为save控制器没有将数据持久保存到数据库中。

为什么不直接通过save视图输出这些值?

答案 1 :(得分:0)

最后通过淘汰过程弄明白了,但现在我看到解决方案应该非常明显。

我需要做的就是将from属性添加到受影响的<g:select>代码中,如下所示:

<g:select from="${loadInstance?.cargoDestination}" name="cargoDestination.id" optionKey="id" value="${loadInstance?.cargoDestination?.id}" />

现在完全符合预期。