Как получить доступ к свойствам домена с контроллера в Grails?

У меня есть следующий класс предметной области 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"

Это, конечно, не очень DRY, и я бы предпочел сохранить это значение по умолчанию в одном месте. Как я могу этого добиться?


person Cesar    schedule 27.05.2009    source источник


Ответы (2)


Очевидное решение состоит в том, чтобы объявить его как константу, а затем ссылаться на него.

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() возвращает значение по умолчанию.

person Gareth Davis    schedule 27.05.2009
comment
Спасибо, это именно то, что я искал. - person Cesar; 27.05.2009

Если в params нет ключа image

def productInstance = new Product(params)

пропустит это свойство и оставит значение по умолчанию, определенное в классе предметной области. Итак, предполагая, что ваши параметры не содержат ключ image, самым простым способом было бы вообще пропустить назначение свойства image для тех продуктов, у которых нет изображения:

def imagePath = getProductPicturePath()
if(imagePath) {
    productInstance.image = imagePath
}
person Daniel Rinser    schedule 27.05.2009
comment
Я не знал об этом. Мои параметры содержат ключ изображения, он исходит из формы загрузки с другими полями, и пользователь может загружать или не загружать файл изображения. - person Cesar; 27.05.2009