2010-07-07 6 views
0

J'utilise des partiels dans Rails combinés avec des modèles de champ enfant jQuery pour générer dynamiquement des formulaires avec plusieurs attributs enfants imbriqués. Au sein de ces partiels est JavaScript qui est déclenché lorsque divers événements (par exemple onChange) se produisent dans le formulaire, et le code qui exécute doit modifier le DOM pour un élément de formulaire lié mais différent. Dans ce cas particulier, je l'utilise pour ajouter plusieurs transactions de vente dans une solution de type point de vente à un groupe particulier de transactions et contrôler quelles données sont collectées pour chaque transaction. Ainsi, par exemple:Générer automatiquement des ID d'élément HTML dans Rails lors de la répétition du même contrôle via des partiels

  1. L'utilisateur clique sur un lien qui ajoute 3 nouveaux enregistrements de transaction au groupe de transactions.
  2. L'utilisateur définit des valeurs différentes dans chacun de ces trois enregistrements de transaction, chacun desquels déclenche un événement onChange qui appelle une fonction JS qui doit manipuler le DOM pour chacun des événements de différentes manières. (Exemple: transaction 1 peut être un retour, donc il change le texte de la transaction du coût au remboursement, la transaction 2 peut être pour un service, donc il change le statut taxable, etc ...)
  3. La fonction JS a pour pouvoir changer le DOM pour la transaction correcte.

Mon problème est # 3 - les éléments DOM étant modifiés ne sont pas les mêmes que l'élément qui génère l'événement, donc je ne peux pas utiliser JS ce. Ils font partie d'un élément parent commun (c'est-à-dire qu'ils partagent un parent <div>), il est donc possible que j'utilise les sélecteurs parent/enfant jQuery pour naviguer vers l'élément correct dans le DOM. Cependant, même cela nécessite une certaine unicité dans les attributs de div id, et je ne suis pas sûr de la meilleure façon dans Rails de les générer dynamiquement. Je suppose que je pourrais utiliser des valeurs aléatoires, mais cela semble mauvais parce qu'il n'est pas vraiment garanti d'être unique et semble juste comme un hack. Je suppose que je pourrais essayer d'introduire une sorte de compteur, mais cela semble aller à l'encontre des principes du développement de Rails.

Toute indication est appréciée. Merci!

Répondre

1

En utilisant l'heure actuelle est la recette pour la douleur et les insectes inexpliqués. Je vous recommande fortement d'utiliser quelque chose comme GUID generator pour générer des ID uniques.

+0

'uuid' de SecureRandom fonctionne bien aussi: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/securerandom/rdoc/SecureRandom.html –

0

vous pouvez utiliser Time.now comme identificateur unique lors de la création d'une nouvelle balise

Time.now.to_i 

ce n'est pas une bidouille ou quelque chose qui va à l'encontre des principes ;-) Rails

+0

Merci - mon seul souci avec ceci est que to_i mesure seulement le temps avec une fidélité en secondes, donc si quelqu'un cliquait sur le lien très rapidement, deux ensembles de divs pourraient être ajoutés avec le même id. Je suppose que je pourrais utiliser to_f, ce qui serait une fidélité plus élevée ... Je verrai comment cela fonctionne. –

+0

oui, vous pouvez utiliser to_f au lieu de to_i pour obtenir plus de netteté;) –

+0

@DavidJames il n'y a pas besoin d'être impoli. Oui, il y a un inconvénient bien connu dans l'utilisation de l'heure actuelle et je n'ai pas l'intention de le vendre comme une * solution solide * qui répond à tous les besoins. Cependant, * cela fonctionne seulement * pour les petits besoins: 1-2 utilisateurs en cliquant sur un bouton pour appliquer des changements sur le DOM. À mon humble avis, il n'y a pas besoin de jeter dans les gemmes de code natif pour résoudre un besoin trivial. Vous voulez plus de pseudo-hasard? utilisez (rand (10000) + Time.now.to_f). Besoin d'une solution de travail à 100%? utiliser la gemme uuid. c'est tout. –