Rails Simple_form (вложенный) - дублирующиеся записи при сохранении

Я использую Rails 5 и простую форму для создания приложения. Я пытаюсь, чтобы каждая вложенная модель отображала свои поля в отдельной вкладке или столбце с помощью Twitter Bootstrap. Теперь у меня есть такой случай, когда при создании новой или редактировании / обновлении существующей родительской записи (здесь "тип документа") существующие записи вложенной модели (здесь "ключевые слова") дублируются. Удаление с помощью:_destroy также не работает,

Я могу создавать и удалять отдельно. Теперь смотрим, чтобы добавить его к родителю и разрешить редактирование. Это то, что я бы использовал гораздо больше. здорово, чтобы заставить его работать. Как это происходит / исправить это?

Это мои модели:

class Documenttype < ApplicationRecord
    has_many :annotations, dependent: :restrict_with_error
    has_many :documents, dependent: :restrict_with_error
    has_many :tagtypes, dependent: :restrict_with_error
    has_many :keywords, dependent: :destroy

    accepts_nested_attributes_for :keywords, allow_destroy: true

    validates :name, presence: true, uniqueness: true, length: { minimum: 5 }
    scope :active, -> { where(active: true) }
end

class Keyword < ApplicationRecord
  belongs_to :documenttype

  validates :keywords, presence: true
  validates :language, presence: true
end

это форма:

<%= simple_form_for @documenttype,  html: { class: 'form-horizontal', multipart: true },
    wrapper: :horizontal_form,
    wrapper_mappings: {
        check_boxes: :horizontal_radio_and_checkboxes,
        radio_buttons: :horizontal_radio_and_checkboxes,
        boolean: :horizontal_boolean
    } do |f| %>

    <div class="btn-toolbar btn-group" role="toolbar">
      <%= f.button :submit, :class => "btn btn-xs btn-default" %> <%= link_to 'List' , documenttypes_path, :class => "btn btn-xs btn-default" %>
    </div>

    <h4>Document Type</h4>

   <div class="col-md-6">

    <%= f.error_notification %>

    <%= f.input :name, placeholder: 'Enter name' %>

    <%= f.input :description, placeholder: 'Description' %>

    <%= f.input :active, as: :boolean %>

    </div>
    <div class="col-md-6">
    <%= f.simple_fields_for :keywords do |ff| %>
      <div class="panel panel-body panel-default">
        <div class="col-md-3">
        <%= ff.input :language, :collection => ["NL","EN"], :label => false %> 
        </div>
        <div class="col-md-8">
        <%= ff.input :keywords, placeholder: 'add keywords separated by " ; " - example: document number; document date' %>
        </div>
        <div class="col-md-1">
        <%= ff.check_box :_destroy, label: "del"%>
        </div>
      </div>
    <% end -%>
    </div>
    <% end -%>

1 ответ

Решение

Изучение этого вопроса:

  • чтобы уничтожить вложенные записи, убедитесь, что (кроме :id) также :_destroy добавляется в strongparams
  • чтобы использовать проверки для вложенных полей, используйте accepts_nested_attributes_for :keywords, allow_destroy: true, reject_if: :something_to_check
Другие вопросы по тегам