2017-07-12 1 views
0

Disons que j'ai un modèleComment puis-je obtenir des rails pour remplir automatiquement un formulaire généré dynamiquement?

class A < ApplicationRecord 
    serialize :vals, Array 
end 

qui stocke un tableau de valeurs. Comment puis-je remplir dynamiquement une liste de valeurs de formulaire? Ma première supposition était d'écrire

<%= @a.vals.each_with_index do |v, i| %> 
    <%= f.text_field :hints %> 
<% end %> 

mais cela me donne des erreurs.

+1

D'une manière générale, 'A.vals' est faux parce que vous déclarent 'vals' comme un champ sérialisé, auquel on accède à partir d'une instance de A, et non de l'objet de classe. 'serialize: vals, Array' semble incorrect, car' Array' n'est pas une classe de sérialiseur. Ne sera pas en mesure d'obtenir plus précis que cela sans plus d'informations. Quelle est la 'form_for' ou' form_tag' pour le formulaire d'exemple? Comment 'vals' est-il initialisé? –

+0

Vous devez ajouter les erreurs à votre question. Et, ce que @AdamLassek a dit, aussi. (Bien que, 'serialize: vals, Array' peut être correct basé sur [cette réponse] (https://stackoverflow.com/questions/19134235/how-to-add-to-a-serialized-array) - pas 100% sûr.) – jvillian

+0

@AdamLassek sérialiser: vals, Array fonctionne – user1876508

Répondre

2

envoi de ce formulaire

<%= form_for @a do |f| %> 
    <% @a.vals.each do |val| %> 
    <%= f.text_field :vals, value: val, multiple: true %> 
    <% end %> 

    <%= f.submit %> 
<% end %> 

passe "a"=>{"vals"=>["first", "second", "third"]} dans les params au contrôleur.

Comme mentionné dans les commentaires, vous voulez regarder le vals à partir d'une instance de A pas la classe A.

Remarque sur le serialize (plus pour les commentaires disant qu'il semble mal), je ne l'avais jamais utilisé, que serialize :vals, Array semble fonctionner pour moi

A.create(vals: ['hint 1', 'hint 2']); A.last.vals 
# (0.2ms) BEGIN 
# SQL (0.4ms) INSERT INTO ... [["vals", "---\n- hint 1\n- hint 2\n"]... 
# (0.6ms) COMMIT 
# A Load (0.3ms) SELECT "as".* FROM "as" ORDER BY "as"."id" DESC LIMIT $1 [["LIMIT", 1]] 
# => ["hint 1", "hint 2"] 
+0

Cela fonctionne parfaitement! Merci – user1876508

+0

En outre, j'ai fait une faute de frappe pour l'instance de A. – user1876508

+0

Après avoir inspecté la source de 'serialize' de plus près, il semble que passer une classe non-codeur comme' Array' le rend par défaut à 'YAMLColumn', qui passe les données désérialisées dans 'Array.new'. Donc, il y avait de la magie ici qui me déroutait. –