如何通过取消选中复选框从父模型中删除has_many?

时间:2015-04-07 16:28:21

标签: ruby-on-rails ruby-on-rails-4 checkbox has-many-through

我对RoR和编程一般都很陌生,并且通读了一些令人头脑麻木的stackoverflow / railsforum / railscasts等等。已经,似乎无法找到解决方案。我的问题与this postthis 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>

1 个答案:

答案 0 :(得分:1)

您需要添加名为check_box的{​​{1}}来表示您希望将其删除。

查看有关此问题的指南:http://guides.rubyonrails.org/form_helpers.html#nested-forms