我对RoR和编程一般都很陌生,并且通读了一些令人头脑麻木的stackoverflow / railsforum / railscasts等等。已经,似乎无法找到解决方案。我的问题与this post和this post几乎完全相同 - 遗憾的是,这两个问题都没有得到解答。
我有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正在寻找已经与项目脱离关系的任务,但这只是一种预感。如果是这样的话,我仍然不知道在哪里以及如何解决这个问题。
Project.rb
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
Assignment.rb
class Assignment < ActiveRecord::Base
belongs_to :project
belongs_to :task
accepts_nested_attributes_for :project, :reject_if => :all_blank
项目控制器#update
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.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>
Project _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>
Project _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>
答案 0 :(得分:1)
您需要添加名为check_box
的{{1}}来表示您希望将其删除。
查看有关此问题的指南:http://guides.rubyonrails.org/form_helpers.html#nested-forms