2009-02-10 4 views
3

Disons que j'ai un DatePicker appelé "foobar":Lecture du g: Datepicker valeur en Grails sans utiliser le "new Object (params)" - méthode

<g:datePicker name="foobar" value="${new Date()}" precision="day" /> 

Comment puis-je lire la valeur soumise de ce sélecteur de date?

Une façon qui fonctionne, mais a des effets secondaires indésirables est la suivante:

def newObject = new SomeClassName(params) 
println "value=" + newObject.foobar 

Cette façon de le faire lire tous les champs soumis dans newObject ce qui est quelque chose que je veux éviter. Je ne suis intéressé que par la valeur du champ "foobar".

La façon dont je l'origine supposais cela pourrait se faire était:

def newObject = new SomeClassName() 
newObject.foobar = params["foobar"] 

Mais Grails ne semble pas faire automatiquement la traduction du champ foobar dans un objet Date().

Mise à jour: Des informations supplémentaires peuvent être trouvées dans le Grails JIRA.

+0

Est-ce que le champ foobar sur SomeClassName a Type de date? L'utilisation de def pourrait ne pas forcer la coersion, alors qu'un type déclaré pourrait forcer la liaison à coercer le type. N'avez pas fait face à cela avant, plus étonnant .... –

Répondre

2

lecture de la g: valeur Datepicker est devenu beaucoup plus facile à Grails 1.2 (voir release notes):

Une meilleure analyse syntaxique Date

Si vous soumettez une date à partir d'une étiquette , obtenir l'objet Date est maintenant simple que de regarder vers le haut de l'objet de par nom (par exemple. params.foo )

-2

Vous avez encore besoin de connaître le format si

def newObject = new SomeClassName() 
newObject.foobar = Date.parse('yyyy-MM-dd', params.foobar) 
+0

La valeur de params.foobar est la chaîne "struct", donc votre solution ne fonctionne pas malheureusement. – knorv

+0

Ups - pensé g: datePicker l'envoie en une seule chaîne. – tcurdt

4

Utilisez l'idiome command object. Dans le cas de votre exemple, je suppose que votre formulaire appelle l'action handleDate. A l'intérieur du contrôleur:


def handleDate = { FoobarDateCommand dateCommand -> 
    def theNextDay = dateCommand.foobar + 1 
} 

est ici FoobarDateCommand. Remarquez comment vous nommez le champ le même que dans la vue:


class FoobarDateCommand { 
    Date foobar 
} 

Les objets de commande sont un moyen pratique pour encapsuler toutes les tâches de validation pour chacun de vos formulaires, en gardant vos contrôleurs agréable et petit.

0

Quand un param dit être un "struct", cela signifie qu'il y a un certain nombre de params pour représenter sa valeur. Dans votre cas, il y a:

  • params [ "foobar_year" stockage année
  • params [ "foobar_month"] stockage mois
  • params [ "foobar_day"] stockage jour

Juste chercher les et faites tout ce que vous voulez :)

Questions connexes