Проблема доступа к переменной во вложенной форме частично - PullRequest
2 голосов
/ 23 апреля 2010

У меня есть вложенная форма в виде рельсов, которая называется вот так

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

и частичное (_invoice_item_number.html.erb) выглядит так

<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>

Это не с сообщением об ошибке

undefined method `description' for nil:NilClass

Почему invoice_item_number возвращает nil-объект в этой части? Это, очевидно, определяется как-то, потому что если я изменю его на что-то другое (например, item_number.description, то сообщение об ошибке станет undefined local variable or method item_number 'для # 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: amount%> both work perfectly well. I have tried a number of solutions such as using @ invoice_item_number` и явно определяющий объект в методе рендеринга, но это не сработало.

Предположительно, есть очень простой ответ на этот вопрос.

Ответы [ 2 ]

6 голосов
/ 23 апреля 2010

Просто перечитайте сообщение с записками Райана на вложенных формах в http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes и найдите ответ. Это уже было в моем коде, но я не понял, что происходит. Я могу получить доступ к объекту invoice_item_number с помощью f.object, поэтому замена <%= invoice_item_number.description %> на <%= f.object.description %> решила мою проблему.

2 голосов
/ 23 апреля 2010

как насчет изменения:

<%= invoice_item_number.description %>

до

<%= f.label :description %>

или если вам нужно поле:

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