2010-12-13 22 views
3

Je voudrais utiliser une collection supplémentaire pour un fields_for. cette collection devrait contenir toutes les possibilités à utiliser dans fields_for. Disons que j'ai une personne avec des tâches qui se produisent régulièrement chaque semaine le même jour. Dans le formulaire de personne, je devrais avoir une entrée pour chaque jour, même s'il n'y a pas encore de tâches sauvegardées. J'ai essayé:rails: fields_for et collection

<% form_for(@person) do |f| %> 
... 

    <% f.fields_for :tasks, @weekdays do |task_fields| %> 
    <%= weekday.name %>: 
    <%= project_fields.text_field :name %> 
    <% end %> 
<% end %> 

maintenant il devrait y avoir pour chaque semaine un champ de texte pour saisir le nom de la tâche de ce jour-là. par exemple: "weekly.name =" lundi "et" task.name = "" "drink coffee", tâche.weekday_id = 1

+0

Vous ne savez pas exactement ce que vous demandez. Avez-vous une erreur que vous ne comprenez pas? Si vous demandez comment mettre en œuvre quelque chose, vous pouvez peut-être être plus précis ou fournir des éclaircissements. – Samo

+0

Avez-vous renseigné par défaut @weekdays les données de départ que vous avez décrites? –

+0

Deux choses, un 'jour de semaine' ne semble pas avoir une valeur, vous pouvez utiliser' task_fields.object.name', deux je pense que les docs sont faux et vous ne pouvez pas passer une collection comme deuxième paramètre à ' fields_for'. Enquêter ... – Kris

Répondre

0

Vous n'êtes pas en cours d'exécution pendant les week_days. Vous devriez faire comme ceci:

<% @weekdays.each_with_index do |weekday, i| %> 
    <% f.fields_for :tasks do |task_fields| %> 
    <%= weekday.name %>: 
    <%= task_fields.text_field :name %> 
    <%= task_fields.hidden_field :weekday_id, :value => (i + 1) %> 
    <% end %> 
<% end %> 

Si vous avez une table « semaine », alors la valeur hidden_field doit être weekday.id

Modifier: 30 Juillet

Je pense que je complètement foiré cette réponse . Laissez-moi essayer de l'améliorer.

<% f.fields_for :tasks, @weekdays do |task_fields| %> 
    <%= weekday = task_fields.object %> 
    <%= weekday.name %>: 
    <%= task_fields.text_field :name %> 
    <%= task_fields.hidden_field :weekday_id, :value => weekday.id %> 
<% end %> 
+15

Notez que selon les docs, il devrait être possible de spécifier une collection comme deuxième argument de 'fields_for' comme OP essayait de le faire. Dans mon expérience, cela semble être cassé cependant. Tenter d'utiliser un helper tel que 'foo_fields.text_field: name' aboutit à une exception quelque chose comme' undefined method 'name' pour # ' –

+0

Légèrement incorrect. A) comme mentionné ci-dessus, rails supporte un second paramètre qui définit la collection à parcourir et B) plus important encore, en utilisant cela, les noms d'attributs HTML seront générés avec le 'id' de chaque objet enfant lors de l'utilisation d'éléments de formulaire comme boutons radio et autres (par exemple 'person [tasks] [1] [: field_name]'). Et une dernière chose, pas directement liée à cette question mais pertinente. Veillez à inclure 'accept_nested_attributes_for: ' dans le modèle parent. Sinon, il ne manquera pas d'une manière évidente, mais il vous restera à retirer vos cheveux. – user2490003

+0

Pour être honnête, je pense que j'ai complètement raté le point de la question dans cette réponse et était terriblement mal: D – rubyprince