【问题标题】:Can't access domain class methods in loaded template无法访问已加载模板中的域类方法
【发布时间】:2015-04-15 14:41:46
【问题描述】:

我正在使用 Grails 1.3.8(旧但黄金)。在我看来,我通过以下方式渲染了一个具有与包含视图相同的变量的模板:

<g:render template="areaInfoTemplate" model="${pageScope.variables}"/>

除非我尝试访问模板内域类上的方法,否则此方法有效:

<g:if test="${currentState == State.findByName('foobar')}">...</g:if>

导致:

Exception Message: Cannot invoke method findByName() on null object 

如果我在主视图 gsp 中访问 State 一切正常。

我的域类是:

class State {
    String name
    String value

    static constraints = {
        name(nullable:false,blank:false,size:0..255)
        value(nullable:false,blank:false,size:0..255)
    }
}

【问题讨论】:

    标签: grails gsp


    【解决方案1】:

    Grails 不是 PHP - 请不要从视图层调用数据库(除非您喜欢解决人为的、自己造成的可伸缩性问题)。只需在控制器或服务中进行调用并将数据传递给要呈现的视图。 GSP 应该只负责渲染输出,而不是数据库访问等更高级别的问题。

    【讨论】:

    • 你是对的。将被修复......但是那个 import 语句的用例是什么?
    • 永不言败 :) 有时在 GSP 中完成工作更务实,当您想在不同控制器(或所有控制器)使用的模板中执行一些逻辑时,可以很难将逻辑移动到控制器层并保持 DRY。但在大多数情况下,taglib 是一个不错的选择 - 您仍然在视图中进行仅查看工作,并将业务逻辑和数据库访问卸载到 taglib 类及其帮助程序,通常是依赖注入服务。
    【解决方案2】:

    我忘记在文件开头添加导入语句:

    <%@ page import="my.wonderful.package.State"%>
    

    【讨论】:

    • 这可能对您有用,但不是解决方案。听@burt
    猜你喜欢
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多