Удаление ВСЕХ ActiveRecord Присоединяйтесь к ассоциациям через форму рельсов. (Добавление и изменение работает отлично) - PullRequest
0 голосов
/ 08 сентября 2018

Так что я думаю, что я сузил, как создавать / изменять ассоциации через формы. Тем не менее, я не могу удалить все ассоциации с помощью этого же метода, потому что представленные параметры включают пустой массив (ничего не выбрано в форме). Когда массив пуст, Rails не делает ничего вместо удаления всех записей ассоциации.

Итак, вот пример моего приложения. Вот две модели:

#app/models/student.rb
class Student < ApplicationRecord
    has_and_belongs_to_many :classes
end

и

#app/models/class.rb
class Class < ApplicationRecord
    has_and_belongs_to_many :students
end

Теперь допустим, что моя форма предназначена для Student:

  <%= form_with(model: @student, local: true) do |form| %>
    <table class="table table-striped table-bordered table-hover student-datatable">
    <thead>
        <tr>
            <th><%= check_box_tag "student_header_checkbox", 0, false %></th>
            <th>Class Name</th>
        </tr>
    </thead>
    <tbody>
        <% @classes.each do |class| %>
        <tr>
            <td><%= check_box_tag "student[class_ids][]", class.id, is_student_part_of_class(class) %></td>
            <td><%= class.name %></td>
        </tr>
        <% end %>
    </tbody>
</table>
  </div>
  <div class="modal-footer">
      <button type="submit" class="btn btn-success btn-sm">
        <i class='fa fa-save'></i> Save changes
      </button>
  </div>
  <% end %>

Теперь в моем Student контроллере я разрешаю class_ids, выполняя это внизу:

#app/controllers/students.rb
def student_params
  params.require(:student).permit(:class_ids => [])
end

Хорошо, так что все хорошо. Когда пользователь выбирает много классов, классы передаются контроллеру Student в виде массива. Если выбраны классы, то создается соответствующая запись об ассоциации, и теперь эти ученики "has_and_belongs_to_many" классы.

Теперь вот проблема

Допустим, у вас есть несколько классов, добавленных к этому ученику, если вы удалите все классы , то в основном массив не будет передан в контроллер; следовательно, контроллер не удаляет все классы, связанные с этим учеником.

Если вы измените выбор, скажем, добавив класс, удалив класс и т. Д. чем-либо, кроме отмены выбора ВСЕХ классов , тогда все будет работать нормально.

Разве rails не обрабатывает автоматическое удаление всех записей об ассоциации, как это? Или я что-то делаю не так или что-то упустил?

1 Ответ

0 голосов
/ 08 сентября 2018

Я только что сделал дополнительную функцию в контроллере, чтобы решить эту проблему как временное решение:

# called after update
def delete_all_associations_if_empty
   classes = student_params[:classes]
   if classes.nil? or classes.empty?
      @student.classes = []
   end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...