Я действительно новичок в 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>