【发布时间】:2013-06-17 06:00:33
【问题描述】:
我正在重构脚手架模板,但遇到了这个问题:
我试图从模板 _FORM.GSP 调用服务(一些安全逻辑) - 但在代码部分,而不是在输出部分
我已经阅读并尝试了这里的建议:How do I call a Grails service from a gsp?
- 我尝试过使用 taglib,但我对 grails 的了解可能不够广泛
- 我尝试将 import 和 def 添加到 _FORM.GSP 文件的开头(grailsApplication 和服务的应用程序实例化都在缺少属性应用程序和缺少属性 grailsApplication 时崩溃)
- 我什至尝试从代码中直接调用 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