2010-01-31 2 views
1

J'ai un modèle qui a start_at et end_at attributs. Dans le formulaire pour l'utilisateur final, j'affiche start_at en utilisant le standard datetime_select, mais je préfère ne pas avoir un deuxième choix de date-heure présenté à l'utilisateur. J'espère que je peux créer deux champs qui représentent une durée; un pour les heures, l'autre pour les minutes. Ma question est la suivante: à mon avis, est-ce que j'utilise des aides de formulaire pour remplir automatiquement les champs lors de la modification d'une entrée existante? De plus, comment est-ce que je connecterais cela au modèle et sauvegarderais l'enregistrement en utilisant l'attribut réel, end_at?Comment utilisez-vous plusieurs champs de formulaire pour interagir avec une seule méthode dans les rails?

Merci à l'avance pour les conseils que vous pouvez donner!

Répondre

1

je dois faire un groupe et je l'ai fait ce qui suit:

  1. Utilisez les FormTagHelper versions des appels pour le champ à traiter spécialement.
  2. Dans le contrôleur, lisez les valeurs form_tag hors de l'objet params.
  3. supprimer les valeurs supplémentaires:
  
    params[:examplemodelname].delete :distance if params[:examplemodelname].has_key? :distance 
  1. mettre les valeurs 'réelles' dans l'objet params (dans votre exemple, ends_at)
  2. appel ExampleModelName.new(params[:examplemodelname]) ou @examplemodelname.update_attributes(params[:examplemodelname]) comme d'habitude.
+0

Cette logique ne serait-elle pas mieux adaptée au modèle? Modèle de graisse, contrôleur maigre? – bloudermilk

+0

Ma règle générale sur de telles choses est que la manipulation de l'objet params devrait se faire dans le contrôleur et non dans le modèle.L'affichage d'une date sous la forme d'une durée plutôt que d'une valeur finale semble également être une question de vue/contrôleur plutôt qu'un problème de modèle. Si vous teniez à cette durée dans le code dans des endroits autres que celui-ci, il pourrait être utile de le mettre en modèle mais pour les cas d'utilisation, cela semble naturel pour le code ou peut-être un assistant pour les bits de forme. – corprew

0

Ne serait-logique comme celui-ci mieux adapté pour le modèle? Fat modèle, contrôleur maigre?

Je pense que c'est tout à fait vrai. Je déteste utiliser un contrôleur pour des trucs comme ça. À mon avis, les contrôleurs sont utilisés au mieux pour quelques choses:

  1. données traînants entre les vues et les modèles, ala opérations CRUD
  2. de contrôle d'accès (généralement avec before_filters)
  3. de soutien aux actions de l'interface utilisateur de fantaisie (sélection multiple , magiciens, etc)

Bien sûr, tout le monde doit trouver son propre équilibre, mais je trouve que «faire une exception» pour quelque chose comme ça a tendance à conduire à des exceptions partout. Sans oublier que la logique du contrôleur est plus difficile à tester.

Pour répondre à votre question: vous devez simplement définir des attributs virtuels dans votre modèle qui vous aident à convertir entre start_at et une durée. Quelque chose comme:

# Return the duration in seconds. Will look different if you want to use 
# multiparameter assignment (which you definitely should consider) 
def duration 
    (end_at - start_at).seconds 
end 

# Store the duration as an instance variable. Might need to use multiparameter 
# assignment if you use a time_select() in the view. 
def duration=(arg) 
    @duration = arg 
end 

before_save :set_end_at 
def set_end_at 
    end_at = start_at + @duration.seconds 
end 

je donnent généralement l'attribut réel dans un before_save pour éviter les conditions de course de l'attribution de forme. Vous n'avez aucune garantie que start_at sera assigné avant ou après la durée, et cela peut introduire des bogues dans votre logique autrement bonne.

Questions connexes