Rails form.object.attribute не может быть доступен внутри nested_fields_for

Я пытаюсь получить доступ к родительскому атрибуту внутри каждого цикла nested_form_fields. Я могу получить доступ к связанным атрибутам "products", но не к атрибутам "sales_order_items". Сгенерированная ошибка: неопределенный метод `service_name'для nil:NilClass.

<%= form.nested_fields_for :delivery_items, wrapper_tag: :tr do |ff| %>
  <td class="col-md-1">                                           
    <div class="input-product_name-div">   
        <% if ff.object.product.present? %>
          <%= ff.object.product.name %>
        <%else%>
          <%= ff.object.sales_order_item.service_name %> #this line fails
        <%end%>
    </div>
  </td> 
<% end %>

Как вы можете видеть в моих моделях ниже, они оба связаны одинаково.

class Product < ApplicationRecord
    has_many :sales_order_items 
    has_many :delivery_items
end

class SalesOrderItem < ApplicationRecord
    belongs_to :sales_order,  optional: true
    belongs_to :product,  optional: true    
    has_many :delivery_items
end

Вот моя модель DeliveryItem:

class DeliveryItem < ApplicationRecord
    belongs_to :product,  optional: true
    belongs_to :sales_order_item,  optional: true
end

Я уверен, что у пункта есть название сервиса. Фактически, если я использую консоль rails, я могу получить к ней доступ через DeliveryItem.last.sales_order_item.service_name

2 ответа

Решение

Проблема заключалась в заголовке формы, я изменил его на это, и все nested_form.object.parent.attributes наконец могут быть найдены:

<%= form.fields_for :delivery_items do |ff| %>

Проблема, кажется, исходит от использования nested_form_fields драгоценный камень. Мне еще предстоит выяснить, как решить эту проблему, не выбрасывая драгоценный камень, но, по крайней мере, моим последним средством было бы просто использовать fields_for, Я хочу использовать драгоценный камень, потому что он уже включает в себя добавление и удаление строк через link_to и javascript.

<%= ff.object.sales_order_item.service_name if object.sales_order_item.present?%>

или для версии ruby ​​больше, чем 2.3.1

<%= ff.object.sales_order_item&.service_name%>
Другие вопросы по тегам