我想将控制器中的一些操作限制为只读。 有什么办法可以吗? 对于某些操作,我想要的是在完成后不保存的事务。
感谢任何帮助。
我们谈论的是1.3.7。
答案 0 :(得分:4)
“如何制作只读域名”不时出现在邮件列表和其他地方。
快速回答是:您无法100%抵御写入。
实现某些只读的各种方法:
使用.read()方法获取一个对象,确保您需要显式.save()以使项目保持不变。
如果在sql上,你可以创建一个视图并为这个视图创建一个域类映射,然后你就不能保存(并且尝试保存会抛出错误)。
make beforeUpdate()抛出异常,从而停止保存。
对静态映射的更改= {},但我不太清楚在那里做什么,已经在邮件列表中提到了我能记得的全部内容,谷歌浏览grails-user的nabble列表如果你想知道。
如果你的东西是相当静态的,那么mysql视图是个不错的选择,如果你需要查询它们,则beforeUpdate()可能是个不错的选择。
你要求'只读行动',你的意思是脚手架吗?以编程方式禁止在控制器操作中保存并不比仅添加保存(或根本不修改对象)更难。
答案 1 :(得分:2)
将逻辑放在grails服务方法
中class MyController {
def myService
def myAction = {
myService.method(params)
[]
}
...
}
并将其标记为只读:
class MyService {
@Transactional(readOnly = true)
def method(def patams) { ... }
}
答案 2 :(得分:1)
您可以在域对象上使用withTransaction
方法,并将其设置为仅在那里回滚。
http://grails.org/doc/latest/ref/Domain%20Classes/withTransaction.html
声明式事务管理是内置的服务,请参阅Grails参考手册Declarative Transactions。它不适用于控制器,但有一个插件:http://www.grails.org/plugin/transactional-controller
答案 3 :(得分:0)
不确定这对你来说是否足够,但是有一种只读的方法,而不是get http://grails.org/doc/latest/ref/Domain%20Classes/read.html