Grails使用g in g:each

时间:2013-11-15 13:59:30

标签: jquery grails get controller

我会立即承认标题可能不是正确的参考,所以如果我使用了错误的短语请告诉我,我会纠正!

概述 - 我有一个Form.gsp和相应的_form.gsp,我从SQL查询中提取了一大堆值,其中包含来自另一个控制器的ID(称为Object,多个对象链接到表单)。

在构建列出所有这些对象的表的过程中,我需要获取对象id,然后将其转到Object控制器,使用ID返回对象名称并使用该值填充文本框。但我无法弄清楚如何做到这一点,这就是我所尝试过的(当然要切掉垃圾)。

对象ID称为object_id,g:每个var都是item。所以我试图将它作为我的Object.get(x)插入: -

value = "${Object.get(item.object_id)}"

但这会导致错误No signature of method: static java.lang.Object.get() is applicable for argument types: (java.math.BigDecimal) values: [4]

顺便提一下,ID值是4,我需要寻找......

我也试过

value = "${Object.get(${item.object_id})}"

但我收到Unclosed GSP expression错误。

这是在我的_form.gsp

<table id="eventList">
        <g:each in="${results}" status = "i" var="item">
            <tr>
                <td colspan="3">
                    <table id = "sub">
                        <tr>
                            <td><b>Object</b></td><td>
                            <g:select style="width:550px;"id="objectID[$i]" name="objectID[$i].id" from="${framework.Object.list(sort:"objDesc")}" optionKey="id" required="" value="${item.object_id}" class="many-to-one"/>

                            <richui:autoComplete name="objectID[$i].id" value = "${Object.get(item.object_id)}" action="${createLinkTo('dir': 'object/searchAJAX')}"    />

                            </td>

                        </tr>
                    </table>                                
                </td>       
            </tr>
        </g:each>
    </table>

另外值得注意的是,我只是希望它返回并显示objDesc值而不是整个条目,并且我不确定如何告诉它基本上说“给我回到ID = item.object_ID的objDesc。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我已经为此提出了一个解决方法,因为我在我的控制器中使用SQL将信息发送到gsp我在另一个JOIN中简单地添加到语句中以从对象表中获取对象描述值在我通过细节之前,我现在可以用“item.object_description”

来引用它

但是,我仍然想知道它是否可以按照原定的目的进行查找,所以我不会将其标记为已经回答......

答案 1 :(得分:0)

您收到的第一个错误:

  

没有方法签名:static java.lang.Object.get()适用于参数类型:(java.math.BigDecimal)值:[4]

表示Object.get()标记中的<richui>调用实际上并未访问您的域对象;它只是通用的java.lang.Object类。

有几种方法可以解决这个问题。

首先,您可以将域类导入到主Form.gsp中,然后_form.gsp应该在您继承它时继承它:

<%@ page import="com.mysite.DomainObject" %>

确保更改“com.mysite”。部分以匹配域对象的包名称。 grails应用程序中的默认包与应用程序的名称相同。因此,您的导入可能看起来像&lt;%@ page import =“myApp.Object”%&gt;

第二种(更精细)方式:在控制器中,您可以传递要访问gsp的实际域对象。因此,在控制器操作结束时,您可能会遇到以下情况:

def sqlResults = someService.queryMethod(parameter1, parameter2)
def domainObjects = DomainObject.findAllBy( it.property == parameter3 )
[results: sqlResults, myObjects: domainObjects]

考虑到使用g:each迭代结果对象的方式,您实际上可能需要将域对象映射到sqlResults的成员。这个方法肯定比仅仅将域对象导入你的gsp更精细,尽管需要考虑。为什么在使用Grails框架findAll方法时运行sql语句来获取域对象的ID?

附注:如果您实际上正在命名域类Object,则可以考虑使用更具域名的名称进行重构,以避免任何歧义。我想你只是为你的帖子做了这个,所以它会更通用,这很好,但考虑使用一个尚未在语言的最低层使用的类名。