2012-10-20 23 views
0

我有简单的层次结构:的Grails - 显示正确的类名

class Atom {} 

class Text extends Atom { String value} 

class Unit { 
    List atoms 
    static hasMany = [ atoms:Atom ] 
} 

比方说,我们创建一个文本对象和一个单元对象,并作为文本的家长选择单位。它工作正常。当我在单元上调用show方法时,我看到我的单元由一个Atom组成。当我点击这个原子时,它将我重定向到原子控制器,但我的原子实际上是文本,我想看到文本控制器。这是预期的行为,因为在我show.gsp有这样的代码:

<g:each in="${unitInstance.atoms}" var="a"> 
    <span class="property-value" aria-labelledby="atoms-label"> 
     <g:link controller="atom" action="show" id="${a.id}"> 
      ${a?.encodeAsHTML()} 
     </g:link> 
    </span> 
</g:each> 

好吧,数据库存储领域中的“类”的实际原子类型,所以我编辑的行3:

<g:link controller="${a.class}" action="show" id="${a.id}">  

而$ {a.class}总是返回原子。 所以,我的问题是 - 我们如何得到实际的类名?

+0

不{A的instanceof文本? 'Text':'Atom'}当用作控制器属性的值时工作吗? – sync

回答

1

您可能碰到了有关Hibernate返回代理而不是膨胀对象的GORM Gotcha

在你的链接,你可以尝试:

<g:link controller="${Atom.get(a.id).getClass()}" ... /> 
+0

它的工作原理!感谢您指出它发生的原因。 – BoredT

1

可能有更好的方法,但how.about在Atom中添加一个方法并在Text中覆盖它,返回相应的字符串?

+0

您的方法也可行,谢谢! – BoredT