如何从 Grails 中的控制器访问域属性?

Posted

技术标签:

【中文标题】如何从 Grails 中的控制器访问域属性?【英文标题】:How to access domain properties from a controller in Grails? 【发布时间】:2010-10-29 04:28:47 【问题描述】:

我有以下 Grails 域类:

class Product   
    String name  
    Float basePrice  
    Category category  
    String image = "default.jpg"  

    static constraints = 
        name(size:3..25, blank:false)
        basePrice(scale:2, nullable:false)
        category(inList:Category.list(), nullable:false)
        image(blank:false)
    

我想从控制器获取图像属性的默认值(在本例中为“default.jpg”)。像这样的:

def productInstance = new Product(params)
productInstance.image = getProductPicturePath() ?: Product().image

getProductPicturePath 返回一个图像路径,但如果没有提交图像,控制器将用默认值替换空值。虽然我当然可以写这样的东西:

productInstance.image = getProductPicturePath() ?: "default.jpg"

它当然不是很干燥,我更愿意将默认值保留在一个地方。我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

显而易见的解决方案是将其声明为常量,然后引用它。

class Product   
    static DEFAULT_IMAGE = "default.jpg"
    String name  
    Float basePrice  
    Category category  
    String image = DEFAULT_IMAGE

    static constraints = 
        name(size:3..25, blank:false)
        basePrice(scale:2, nullable:false)
        category(inList:Category.list(), nullable:false)
        image(blank:false)
    


productInstance.image = getProductPicturePath() ?: Product.DEFAULT_IMAGE

更好的是,让getProductPicturePath() 返回默认值。

【讨论】:

谢谢,这正是我想要的。【参考方案2】:

如果params中没有image

def productInstance = new Product(params)

将跳过此属性并保留域类中定义的默认值。因此,假设您的参数不包含 image 键,最简单的方法是为那些没有图像的产品完全跳过 image 属性的分配:

def imagePath = getProductPicturePath()
if(imagePath) 
    productInstance.image = imagePath

【讨论】:

我没有意识到这一点。我的参数包含一个图像键,它来自带有其他字段的上传表单,用户可能会也可能不会上传图像文件。

以上是关于如何从 Grails 中的控制器访问域属性?的主要内容,如果未能解决你的问题,请参考以下文章

从 Grails 中的过滤器定义控制器可访问变量

Grails:如何从控制器或服务访问 i18n?

使用 Grails 在服务器端获取 JSON 数据

Grails - 控制器和视图之间的通信

如何从grails中的控制器调用服务

在过滤器中访问 request.JSON 后 Grails 2.5.0 控制器命令对象绑定