Grails: как установить мета-ограничение для свойства класса домена? - PullRequest
4 голосов
/ 25 января 2011

У меня есть класс Contact, который принадлежит подписке, и я хочу установить гипотетическое ограничение только для чтения для свойства подписки, которое будет использоваться в шаблонах скаффолдов.

Класс выглядит как

class Contact {

   static belongsTo = [subscription: Subscription]

   static constraints = {
     subscription(nullable: false, readonly: true) // hypothetic *readonly* constraint
     name(blank: false)
     email(blank: false, email: true)
   }

   Integer id
   String name
   String email
   String description
}

Я обнаружил ConstrainedProperty.addMetaConstraint метод, который «добавляет мета-ограничения, которые не являются информационными информационными ограничениями».

Как мне вызвать его из класса Domain?

А как мне получить мета-ограничение?

Ответы [ 2 ]

3 голосов
/ 26 января 2011

В шаблонах скаффолдинга есть свойство domainClass типа org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass.Эти объекты имеют свойство constrainedProperties.Чтобы иметь избыток «только для чтения», вы должны сделать это:

Класс вашего домена:

class Contact {
   static belongsTo = [subscription: Subscription]

   static constraints = {
       subscription(nullable: false, attributes: [readonly: true])  
   }

   String description
}

в шаблоне скаффолдинга:

def ro = domainClass.constrainedProperties.subscription.attributes.readonly

в DefaultGrailsDomainClassконструктор с атрибутом типа Class, может быть, вы можете сделать это:

def domainClass = new DefaultGrailsDomainClass(Contact.class)
def ro = domainClass.constrainedProperties.subscription.attributes.readonly

Возможно, для этого есть Фабрика, но я не знаю.

1 голос
/ 25 января 2011

Если вам конкретно нужно ограничение readonly, которое влияет на поля формы скаффолдинга, вы можете использовать:

static constraints = {
    subscription(editable: false)
}

Вот список ограничений, которые используются renderEditor.template (которые я мог бы найтис быстрым поиском, в любом случае):

  • редактируемый (если false, делает отображаемое поле доступным только для чтения - работает для полей String и Date)
  • виджет (если 'textarea'поле отображается как текстовое поле - работает для полей типа String)
  • (для полей даты - значение ограничения для атрибута формата datePicker)
...