2010-02-18 12 views
0

J'ai un modèle d'utilisateur qui contient un champ appelé, disons, text1. Dans les utilisateurs/nouveau formulaire, je veux avoir 4 zones de texte individuelles pour ce texte1. Dans mon modèle, je vais prendre les valeurs de ces boîtes et les concaténer ensemble comme des valeurs séparées par des virgules et les stocker dans la base de données. Pour vous donner une compréhension, c'est ce que je veux.comment utiliser un tableau dans form_for?

<input type="text" name="user[text1][]" /> 
<input type="text" name="user[text1][]" /> 
<input type="text" name="user[text1][]" /> 
<input type="text" name="user[text1][]" /> 

Comment est-ce que j'obtiens ceci en utilisant la méthode form_for helper? Pour l'instant, ne vous inquiétez pas de la méthode d'accès dans le modèle, tout est pris en charge. Merci beaucoup.

Répondre

1

Ajouter quelques attributs virtuels à votre modèle User

class User < ActiveRecord::Base 
    attr_accessor :text1_part1 
    attr_accessor :text1_part2 
    attr_accessor :text1_part3 
    attr_accessor :text1_part4 

    def before_validation 
     self.text1 = "#{self.text1_part1}#{self.text1_part2}#{self.text1_part3}#{self.text1_part4}" 
    end 
    # make sure you fill the correct values for 
    # the text parts for an existing record. 
    # This can be done by implementing `after_find` or overriding 
    # `text1=`. 
end 

Selon vous, utilisez le code les nouveaux attributs au lieu de text1

<% form_for(:user) do |f| %> 
    #some code 
    <%= f.text_field :text1_part1> 
    <%= f.text_field :text1_part2> 
    <%= f.text_field :text1_part3> 
    <%= f.text_field :text1_part4> 
    #some code 
    <%= f.submit "Save"> 
<% end %> 
+0

Merci pour votre réponse. Mais ce genre de travail n'est-il pas là? N'y a-t-il pas une façon précise de faire cela? De même, dans le cas où le formulaire échoue à la validation dans le modèle et charge à nouveau, je souhaite que les zones de texte soient automatiquement remplies avec les valeurs que j'avais entrées avant la soumission. Votre méthode exigera que j'écrive du code pour séparer le contenu de text1 dans les trois autres zones de texte. Je me demande simplement si les rails ont quelque chose de intégré pour la manipulation de tableaux comme celui-ci dans les formulaires. Merci. –

+0

Dans le formulaire reload, les valeurs seront préservées car les champs 'part' sont des attributs virtuels sur le modèle. C'est une pratique légitime pour votre scénario car ce que vous affichez n'est pas ce que vous économisez. –

0

La réponse précédente donne une solution, donc je suis simplement fournir quelques-uns le contexte de la raison pour laquelle ce que vous demandez ne fonctionne pas comme vous pourriez l'espérer.

Vous pouvez en effet créer un formulaire avec plusieurs champs de saisie du même nom, et ces données seront affichées. Cependant, lorsque les rails reçoivent la publication, elle paramètre automatiquement les paramètres de données et/ou d'URL. Il se divise essentiellement sur le & et attribue les paires clé/valeur au hachage param. Le résultat de ceci est que params [: user] [: text1] (de votre exemple) aura la valeur de la dernière instance de l'utilisateur [text1] qu'il a rencontré, puisqu'il s'agit simplement d'une affectation de valeur à une clé existante. Vous voudrez peut-être creuser des affectations multiparamétriques ActiveRecord pour avoir une idée du fonctionnement des attributs datetime, car ils sont similaires à votre cas d'utilisation.

0

Je travaille sur quelque chose de similaire et il semble que la sérialisation soit ce que vous cherchez. Malheureusement, mes problèmes ne sont pas encore résolus, donc je ne peux rien fournir de plus concret.