Связи областей действия для модели, используемой несколько раз в одной форме с simple_form и cocoon - PullRequest
0 голосов
/ 22 марта 2019

Я оказался в следующей полунормальной ситуации:

class Contract
  has_many :contract_locations, dependent: :destroy
  has_many :locations, through: :contract_locations
end

class ContractLocation
  enum role: { shipper: 0, receiver: 1 }
  belongs_to :contract
  belongs_to :location
end

class Location
  has_many :contract_locations, dependent: :destroy
  has_many :contracts, through: :contract_locations
end

Форма, о которой идет речь, - это форма Contract, которая отлично работает в ситуации, когда для каждого связанного местоположения я выбираю местоположение и роль. Архитектурно это работает, но поскольку у меня фактически есть два Location "типа" (:shipper и :receiver), я бы хотел, чтобы они были двумя отдельными частями формы. Таким образом, по сути, это раздел формы со своей кнопкой «Добавить место доставки» и другой раздел со своей кнопкой «Добавить место получения». Я могу достичь этого, но проблема, которую он вызывает, заключается в том, что форма заполняется из существующих отношений. Если я отправлю форму, как это:

Screen Shot 2019-03-21 at 1 44 11 PM

И я снова загружаю форму редактирования, значения заполняются так:

Screen Shot 2019-03-21 at 1 45 19 PM

Очевидно, это потому, что кокон просто заполняет ассоциированные Location с, как он должен, и не различает Location с конкретными role с. Существуют ли какие-либо области видимости, которые позволили бы мне создавать эти элементы формы только для Location s для некоторой конкретной области (как в role: :shipper)?

РЕДАКТИРОВАТЬ: я должен заметить, что я пытался использовать предоставленные обратные вызовы Javascript, в частности before-insert, но не похоже, что они срабатывают при первой загрузке формы.

1 Ответ

0 голосов
/ 22 марта 2019

Я решил свою проблему, хотя мне все еще интересно посмотреть, есть ли встроенный в Cocoon способ решения этой проблемы.

Мое решение - проверить объект формы в моей части кокона:

<%= f.simple_fields_for :contract_locations do |contract_location| %>
  <!-- This check prevents locations of the wrong role being rendered in the wrong form section. -->
  <% if contract_location.object.role == role.to_s %>
    <%= render 'form_location_fields', f: contract_location, role: role %>
  <% end %>
<% end %>
...