2009-09-09 7 views
1

J'ai une colonne datetime dans un modèle et je veux afficher le formulaire pour cela en tant que text_fields séparés pour l'heure au lieu des menus déroulants heletime_select helper.Rails Méthode setter split setter

Je sais que je vais devoir valider et recréer la date pour retourner à la base de données, mais je ne sais pas comment. Dois-je utiliser des méthodes getter et setter d'attributs virtuels? EG ...

def virtual_minute=(minute) 
    ... 
end 

def virtual_hour=(hour) 
    ... 
end 

Ou peut-être dans un rappel?

Un peu stucko!

Répondre

2

Vous n'avez pas besoin de les écrire vous-même si vous utilisez un modèle ActiveRecord. Les attributs multi-paramètres peuvent être soumis via des formulaires en pièces. À titre d'exemple voir comment la méthode datetime_select vous n'êtes pas trop friands d'œuvres:

http://apidock.com/rails/ActionView/Helpers/DateHelper/datetime_select

En interne les différents paramètres se soumis à l'ordre et le type d'informations afin qu'ils puissent être correctement codées. Vous pouvez créer cette fonctionnalité en nommant simplement vos champs de la même manière. Il n'est pas trop difficile de copier une méthode d'aide que vous aimez et de mettre la version ajustée dans votre module ApplicationHelper.

Les valeurs montrent ici comme paramètres quelque chose nommé le long des lignes de:

model_type[attribute(1i)] 
model_type[attribute(2i)] 
model_type[attribute(3i)] 

Ceux-ci sont combinés dans l'ordre correct, converti au besoin, et soumis à un constructeur pour que les attributs type particulier, par exemple DateTime. Cela évite d'avoir à créer vos propres méthodes d'encapsuleur.

Dans tous les cas, la manière facile de créer des attributs est d'utiliser la méthode de attr_accessor, tels que:

class MyModel < ActiveRecord::Base 
    attr_accessor :some_date 
end 

Cela va créer les accesseurs et mutateurs appropriés.

Vous pouvez utiliser un déclencheur before_validation pour recombiner les valeurs en une seule passe ou écrire un wrapper autour de la méthode de récupération de date pour la réexécuter si nécessaire.

+0

Quelques points valides là. – Cameron

1

Les attributs virtuels sont bons IMO car ils stockent les données utilisateur dans une variable d'instance. Ensuite, dans un before_save, vous construisez un objet Time qui l'affecte à la variable réelle.

0

je tentais de partager le temps de la date (je pense que ceci est votre question) quand je pris un coup d'œil à l'source code et a trouvé l'option :ignore_date:

time_select va également générer 3 entrée Tags cachés, pour l'année réelle, mois et jour sauf si l'option : ignore_date est définie sur true.

Si vous définissez le : ignore_date true, vous devez avoir un date_select sur la même méthode dans la forme sinon une exception sera soulevée.

En d'autres termes, en le définissant à true, il est possible de diviser la date et l'heure.

Voir time_select et date_select

(il est également possible d'utiliser le datetime sélectionner avec :discard_day, :discard_hour ...)

Questions connexes