【问题标题】:GRAILS: Can I call service logic from _FORM.GSP template?GRAILS:我可以从 _FORM.GSP 模板调用服务逻辑吗?
【发布时间】:2013-06-17 06:00:33
【问题描述】:

我正在重构脚手架模板,但遇到了这个问题:

我试图从模板 _FORM.GSP 调用服务(一些安全逻辑) - 但在代码部分,而不是在输出部分

我已经阅读并尝试了这里的建议:How do I call a Grails service from a gsp?

  1. 我尝试过使用 taglib,但我对 grails 的了解可能不够广泛
  2. 我尝试将 import 和 def 添加到 _FORM.GSP 文件的开头(grailsApplication 和服务的应用程序实例化都在缺少属性应用程序和缺少属性 grailsApplication 时崩溃)
  3. 我什至尝试从代码中直接调用 taglib 作为方法 isAllowedToEdit 和 g.isAllowedToEdit 都在未知方法上崩溃。 "没有这样的属性 g"

模板 _form.gsp 的规则似乎与标准 gsp 视图不同

我想做这样的事情:

private renderFieldForProperty(p, owningClass, prefix = "") {
    boolean hasHibernate = pluginManager?.hasGrailsPlugin('hibernate')
    boolean display = true
    boolean required = false
    if (hasHibernate) {
        cp = owningClass.constrainedProperties[p.name]
        display = (cp ? cp.display : true)
        required = (cp ? !(cp.propertyType in [boolean, Boolean]) && !cp.nullable && (cp.propertyType != String || !cp.blank) : false)
    }

    /* trying to do this part */
    // I want to assign value to cp.editable - so later I can render read-only fields in renderEdit
    if (!mySecurityService.canEdit(springSecurityService.currentUser, owningClass.getClass(), actionName, p.name)) {
        cp.editable = false
    }
    /* trying to do this part */

    if (display) { %>
<div class="fieldcontain \${hasErrors(bean: ${propertyName}, field: '${prefix}${p.name}', 'error')} ${required ? 'required' : ''}">
    <label for="${prefix}${p.name}">
        <g:message code="${domainClass.propertyName}.${prefix}${p.name}.label" default="${p.naturalName}" />
        <% if (required) { %><span class="required-indicator">*</span><% } %>
    </label>
    ${renderEditor(p)}
</div>
<%  }   } %>

如果有任何方法可以分配 cp.editable - 我会尝试你的建议

【问题讨论】:

  • 您是否尝试在页面顶部定义服务?
  • 是的,我在 _form.gsp 之上添加了 import 和 def - 按照我列出的另一个主题中的说明
  • 我认为这不是好方法,只是从控制器调用服务..
  • 我会考虑使用控制器传递该信息的方法

标签: templates grails service view


【解决方案1】:

模板 _form.gsp 的规则似乎与标准 gsp 视图不同

生成的 _form.gsp 与其他 gsps 工作方式相同,但 scr/templates/scaffolding/ 中的模板不同。像您正在做的自定义模板有点棘手。请记住,您正在编写的逻辑是针对 Grails 如何生成视图(gsp)。这意味着您告诉 Grails 在内存或文件中生成视图之前检查一些逻辑。对于运行时的动态(内存中)脚手架,您可能能够在某种程度上实现这一点,但对于静态脚手架肯定不行。那是因为 Grails 生成模板时不知道currentUser

如果您生成视图然后自定义它们而不是修改它们的模板,您的问题会简单得多。然后您可以注入您的服务并进行其他检查。但是,正如您还提到的,这些逻辑在标签库here 中更好。

此外,由于您提到了安全性,呈现不可编辑的字段并不能保证无法编辑您的字段。我建议将检查逻辑放在控制器中,例如在 SAVE 或 UPDATE 操作中,以防止任何未经授权的用户编辑字段。

【讨论】:

  • 是的,我担心它会是这样的——用于(渲染)模板的(脚手架)模板可能超出视图和(渲染)模板的标准上下文;因此,在我看来,在其中使用动态(会话)逻辑的唯一方法是使用标签库,该标签库将根据当前用户角色评估“在线”;我会试一试,当它奏效时,我会给你的答案打分 - 它令人大开眼界(遗憾的是......)
【解决方案2】:

你试过了吗?

    <%@ page import="com.myproject.MyService" %>
<%
    def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance()
%>

这肯定会奏效。

通过此链接:click here

【讨论】:

  • 我正在使用模板 GSP,而不是标准视图,因此无法通过模板生成器进行编译 -> “无法解析模板脚本”并且在 @ 符号解析时失败
猜你喜欢
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 2012-03-14
  • 2011-11-07
相关资源
最近更新 更多