2015-11-04 37 views
0

调用域名的方法,我有以下域类:的Grails:普惠制

package com.example 

class Location { 
    String state 

    def getStatesList(){ 

    def states = ['AL','AK','AZ','AR','CA','CO','CT', 
     'DC','DE','FL','GA','HI','ID','IL','IN','IA', 
     'KS','KY','LA','ME','MD','MA','MI','MN','MS', 
     'MO','MT','NE','NV','NH','NJ','NM','NY','NC', 
     'ND','OH','OK','OR','PA','RI','SC','SD','TN', 
     'TX','UT','VT','VA','WA','WV','WI','WY'] 
    return states 
    } 
} 

在我的GSP,我想在选择下拉这样

<g:select name="location.state" class="form-control" from="${com.example.Location?.getStatesList()}" value="${itemInstance?.location?.state}" noSelection="['': '']" /> 

在显示状态列表这样做,我收到“缺少方法例外”

如果我更改列表的方法,我不会再收到错误,但我不希望这样。

from="${com.example.Location?.list()}" // works 
from="${com.example.Location?.getStatesList()}"  // does not work 

任何帮助,非常感谢。

+2

'getStatesList()'应该以您尝试使用的方式声明为'static'。 – dmahapatro

回答

1

正如dmahaptro所说,您可以通过使getStatesList()成为静态方法来解决此问题。

class Location { 
    String state 

    static List<String> getStatesList() { 
     ['AL','AK','AZ','AR','CA','CO','CT', 
     'DC','DE','FL','GA','HI','ID','IL','IN','IA', 
     'KS','KY','LA','ME','MD','MA','MI','MN','MS', 
     'MO','MT','NE','NV','NH','NJ','NM','NY','NC', 
     'ND','OH','OK','OR','PA','RI','SC','SD','TN', 
     'TX','UT','VT','VA','WA','WV','WI','WY'] 
    } 
} 

然后你就可以执行Location.statesListLocation.getStatesList()

替代

我认为一个更清洁的替代方案是用一个最终常数

class Location { 
    String state 

    static final List<String> STATES = 
     ['AL','AK','AZ','AR','CA','CO','CT', 
     'DC','DE','FL','GA','HI','ID','IL','IN','IA', 
     'KS','KY','LA','ME','MD','MA','MI','MN','MS', 
     'MO','MT','NE','NV','NH','NJ','NM','NY','NC', 
     'ND','OH','OK','OR','PA','RI','SC','SD','TN', 
     'TX','UT','VT','VA','WA','WV','WI','WY'] 
} 

然后你就可以访问列表以同样的方式:​​。不同之处在于全部大写的名称暗示了一个不会更改的值(并且不需要访问数据库)。

0

list()是域对象的元类的一种方法。为了做你想做的事情,你必须实例化一个Location实例(或添加到元类)。如果我是你,我会亲自使用Enum

0

您必须使getStatesList()为静态,因为您未访问Location类的实例。