2010-01-14 5 views
1

OK, la relation est la suivante: Le programme a beaucoup: les événements et chaque événement appartient à un organisateur (qui has_many: événements)Rails 2.3: Comment accéder aux relations d'un modèle, quand hsing fields_for et: accepts_nested_attributes_for

En un formulaire pour Program/edit, je voudrais lister les événements associés, et avec chacune de ces entrées, avoir également accès à chaque Organisateur afin que je puisse faire quelque chose comme:

textfield (event.name) | textfield (event.date) | étiquette (event.organizer.name)

Alors ...

<% form_for([:admin, program]) do |f| %> 

... 

    <h3>Event Data Fields</h3> 
    <table> 
    <% f.fields_for :events do |event_form| %> 
    <tr class="line_item"> 
    <td><%= event_form.text_field :name %></td> 
    <td><%= event_form.text_field :date %></td> 
    <td><%= event_form.text_field "organizer.name", :disabled=>true %></td> 

    </tr> 


     <% end %> 
    </table> 
    <p><%= f.submit "Submit" %></p> 
<% end %> 

De toute évidence, event_form.text_field "organizer.name" ne fonctionnera pas, mais c'est le concept

Répondre

2

Pourquoi ne pas simplement utiliser des champs pour ...

<% form_for([:admin, program]) do |f| %> 

... 

    <h3>Event Data Fields</h3> 
    <table> 
    <% program.events.each do |event| %> 
     <% f.fields_for event do |event_form| %> 
    <tr class="line_item"> 
    <td><%= event_form.text_field :name %></td> 
    <td><%= event_form.text_field :date %></td> 
    <% event_form.fields_for(:organizer) do |organizer_form| %> 
     <td><%= organizer_form.text_field :name, :disabled=>true %></td> 
    <% end %> 
    </tr> 
     <% end %> 
    <% end %> 
    </table> 
    <p><%= f.submit "Submit" %></p> 
<% end %> 
+0

Eh bien, cela a semblé fonctionner, aussi longtemps que j'ajoute un accept_nested_attributes_for: organisateur au modèle d'événement – Zando

+0

@Zando: dans mon exemple, vous n'avez pas besoin d'utiliser 'fields_for' et' accepte_nested_attributes_for' :) – klew

+0

+1: beaucoup plus agréable que mon essai! :) – Veger

0

Rails forme les aides ne fonctionnent que si vous travaillez sur un objet à la fois. Si vous souhaitez mettre à jour les attributs d'autres enregistrements en même temps, vous devez utiliser text_field_tag ​​pour ces champs et inclure une logique personnalisée dans le contrôleur pour interpréter/enregistrer ces données. À mon humble avis, c'est loin d'être la meilleure pratique.

D'autres solutions incluent l'utilisation de l'édition AJAX en ligne ou, si l'idée est de pouvoir associer des organisateurs à des événements lors de l'édition, d'utiliser un champ de sélection.

Cependant, si les organisateurs sont si étroitement liés aux événements de votre domaine que vous souhaitez modifier leurs champs en même temps, pourquoi ne pas avoir simplement organizer_name sur votre objet événement? Au moins, ce serait mon instinct sans en savoir plus sur votre modèle d'objet. ?

+0

bien en fait, je veux juste montrer le nom de l'organisateur ... pas nécessairement mettre à jour ses attributs, ce que je comprends serait un peu plus compliqué d'un formulaire – Zando

+0

Vous n'avez pas besoin de logique personnalisée. Maintenant, quand Rails supporte les formes imbriquées, il peut faire pour vous toute la "logique personnalisée". Vous pouvez l'imbriquer à plusieurs niveaux et créer des formes très complexes. Bien sûr, il existe des situations où l'approche par défaut ne fonctionne pas, mais cela fonctionne dans la plupart des cas. – klew

0

Vous pouvez le faire comme halogenandtoast mentionné, mais si vous voulez seulement montrer ce domaine, vous pouvez aussi le faire comme ceci:

Au lieu de:

<td><%= event_form.text_field "organizer.name", :disabled=>true %></td> 

put:

<td><%= event_form.object.organizer.name %> </td> 

Lorsque vous ajoutez object pour créer un générateur, il se réfère à l'objet traité, vous pouvez donc accéder à ses attributs.

Questions connexes