Как удалить has_many через ассоциацию из родительской модели, сняв флажок?

Я действительно новичок в RoR и программировании в целом, и я прочитал ошеломляющее количество stackoverflow/railsforum/railscasts... и т. д. уже и просто не могу найти решение. Моя проблема почти идентична этот пост и этот пост - - на оба из них, к сожалению, не ответили.

У меня есть 3 модели: проект, задача и задания. У меня есть набор флажков существующих задач (с использованием simple_form и cocoon), которые пользователь может выбрать для добавления в проект. Добавление задач путем установки их флажков работает, но я не могу снять флажки и удалить ассоциацию (назначение). Когда я пытаюсь сохранить свои изменения, я встречаю эту ошибку:

ActiveRecord::RecordNotFound in ProjectsController#update error: 
Couldn't find Task with ID=28 for Project with ID=39.
    def raise_nested_attributes_record_not_found!(association_name, record_id)

Я предполагаю, что AR ищет задачу, которая уже не связана с проектом, но это всего лишь догадка. Если это так, то я до сих пор понятия не имею, где и как решить эту проблему.

проект.рб

class Project < ActiveRecord::Base
has_many :assignments, dependent: :delete_all
has_many :tasks, :through => :assignments
accepts_nested_attributes_for :tasks, reject_if: :all_blank
accepts_nested_attributes_for :assignments, :allow_destroy => true

Task.rb

class Task < ActiveRecord::Base
has_many :assignments
has_many :projects, :through => :assignments
accepts_nested_attributes_for :assignments

Задание.рб

class Assignment < ActiveRecord::Base
belongs_to :project
belongs_to :task
accepts_nested_attributes_for :project, :reject_if => :all_blank

Контроллер проекта#обновление

def update
    @project = Project.find(params[:id])
    params[:project][:task_ids] ||= []
    if @project.update_attributes(project_params)
        flash[:success] = "Your project has been updated!"
        redirect_to @project
    else
        render 'edit'
    end
end

private
    def project_params
        params.require(:project).permit(:job_code, :task_ids => [], 
                                        tasks_attributes: 
                                        [:id, :item, :description, :requirement, :complexity, 
                                         :est_time, :actual_time, :_destroy],
                                        assignments_attributes: [:id, :_destroy, :task_id])
    end

Я был бы очень признателен за любую помощь/понимание/рукопожатие для решения этой проблемы! Слишком много времени было потрачено на то, чтобы понять это самостоятельно, учитывая мои ограниченные знания о рельсах.

Спасибо!

EDIT: включен код формы Project edit.html.erb

<% provide(:title, "Edit project") %>
<h1>Update your project status</h1>

<div class="row">
    <%= minimal_form_for @project, html: { class: "form-inline"} do |f| %>
        <% if @project.errors.any? %>
            <%= render 'shared/error_messages', object: f.object %>
        <% end %>
        <h4>Choose an existing task</h4>
        <%= f.association :tasks, :collection => Task.all.to_a, :label_method => :item,
                                      :as => :check_boxes,
                                      :wrapper => :vertical_radio_and_checkboxes,
                                      :checked => params[:task_id] %>
        <%= render 'form', f: f %>
        <%= f.submit "Save changes", class: "btn btn-primary" %>
    <% end %>
</div>

Проект _form.html.erb

<h3>Tasks</h3>
<div id="tasks">
    <%= f.simple_fields_for :tasks do |task| %>
        <%= render "projects/task_fields", :f => task %>
    <% end %>
    <div class="links">
        <%= link_to_add_association "Add task", f, :tasks, class: 'btn btn-primary' %>
    </div>
</div>

Проект _task_fields.html.erb

<div class="nested-fields">
    <%= f.input :item %>
    <%= f.input :description %>
    <%= f.input :complexity, collection: Task.complexities.keys, :selected => '' %>
    <%= f.input :est_time %>
    <%= f.input :actual_time %>
    <%= link_to_remove_association "Remove task", f, class: 'btn btn-primary' %>
</div>

person Community    schedule 07.04.2015    source источник
comment
Пожалуйста, добавьте код формы и объясните эту строку 'params[:project][:task_ids] ||= []'   -  person dostu    schedule 07.04.2015
comment
Обновил мой вопрос с кодом формы. Строка 'params[:project][:task_ids] ||= []' использовалась вместо hidden_field_tag ​​в моей форме. Если флажки не отмечены, массив task_id будет передан как пустой, поскольку флажки HTML не отправляют значение, если они пусты.   -  person    schedule 07.04.2015


Ответы (1)


Вам нужно добавить check_box с именем :_destroy, чтобы показать, что вы хотите его удалить.

Ознакомьтесь с руководством по этому вопросу: http://guides.rubyonrails.org/form_helpers.html#nested-forms

person Paulo Fidalgo    schedule 01.08.2016