2010-04-23 4 views
2

J'ai une forme imbriquée partielle dans un rail vue que l'on appelle comme çaProblème d'accès variable dans une forme imbriquée

<% f.fields_for :invoice_item_numbers do |item_no_form| %> 
    <%= render 'invoice_item_number', :f => item_no_form %> 
<% end %> 

et la partie (_invoice_item_number.html.erb) se présente comme suit

<div class='invoice_item_numbers'> 
<% if f.object.new_record? %> 
     <li><%= f.label :item_number %><%= f.text_field :item_number %> 
    <%= link_to_function "remove", "$(this).parent().remove()", :class => 'remove_link' %></li> 
<% else %> 
    <li class="inline"><%= f.label :item_number %><%= f.text_field :item_number %> 
    </li><li class="inline"><%= f.label :description %><%= invoice_item_number.description %></li><li><%= f.label :amount %><%= f.text_field :amount %> 
    <%= f.check_box '_destroy', :class => 'remove_checkbox' %> 
    <%= f.label '_destroy', 'remove', :class => 'remove_label' %></li> 
<% end %> 
</div> 

cela échoue avec le message d'erreur

undefined method `description' for nil:NilClass 

Pourquoi invoice_item_number retourne un objet nul dans cette partie? Il est de toute évidence être définie en quelque sorte parce que si je change à quelque chose d'autre (par exemple item_number.description le message d'erreur devient undefined local variable or method item_number » pour # instead. The invoice_item_number object that is being displayed by this partial is being used perfectly well by the form helpers as <% = f.text_field: item_number%>and <% f.text_field: Montant%>both work perfectly well. I have tried a number of solutions such as using @ invoice_item_number` et définir explicitement un objet dans la méthode render, mais ceux-ci ne sont pas travaillé

Vraisemblablement il y a une réponse très simple à cette

Répondre

6

Juste relire des morceaux de Ryan Post sur les formulaires imbriqués à http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes et trouvé la réponse. C'était déjà dans mon code mais je ne comprenais pas ce qui se passait. Je peux accéder à l'objet invoice_item_number avec f.object afin de remplacer <%= invoice_item_number.description %> avec <%= f.object.description %> résolu mon problème.

+0

doux. (J'ai mal lu votre question, désolé ;-) – ohho

+0

Pas de problème. Je vous suis reconnaissant d'avoir pris le temps de le lire. Merci. – brad

+1

est-ce moi ou sont la majorité des «célèbres» rails développeurs nommés Ryan? Ryan Bigg, Ryan Bates, Ryan Daigle ... wtf hahah – imjp

2

que diriez-vous de changer:..

<%= invoice_item_number.description %> 

à

<%= f.label :description %> 

ou si vous avez besoin d'un champ:

<%= f.text_field :description %> 
+0

Eh bien, j'ai déjà f.label: description là-dedans. Fait intéressant, si je mets dans f.text_field: description cela accède à la méthode de description exactement comme je veux, mais je ne veux pas de champ de texte, je veux juste le texte. Merci quand même. – brad

+0

invoice_item_number est nul (pas encore défini) dans le partiel. Si vous voulez accéder aux données du modèle, vous devez définir @invoice_item_number dans le contrôleur et accéder par @ invoice_item_number.description – ohho

+0

Hmm, mais invoice_item_number est un attribut imbriqué dans ce cas. L'attribut parent (facture) est défini dans le contrôleur avec @ invoice = Invoice.find (params [: id]). Ce que je veux vraiment accéder est facture.invoice_item_number.description mais je ne suis pas sûr de savoir comment dans mon parti. – brad

Questions connexes