缺少必需的键:更新嵌套元素时 [:id]

missing required keys: [:id] when updating a nested element

首先非常感谢你帮助我。

我正在开发一个项目工具,其中我有一个 has_many project_tasks 的项目模型。 project_tasks 属于一个项目。

我正在尝试将项目任务标记为完成操作,但我似乎无法在补丁操作中获取 project_task id。

这是我的路线: (请注意,我对项目也有完整的操作,但效果很好)

resources :projects do
    resources :project_tasks do
      member do
        patch :complete
      end
    end
    member do
      patch :complete
    end
  end

耙路线

complete_project_project_task PATCH  /projects/:project_id/project_tasks/:id/complete(.:format) project_tasks#complete
        project_project_tasks GET    /projects/:project_id/project_tasks(.:format)              project_tasks#index
                              POST   /projects/:project_id/project_tasks(.:format)              project_tasks#create
     new_project_project_task GET    /projects/:project_id/project_tasks/new(.:format)          project_tasks#new
    edit_project_project_task GET    /projects/:project_id/project_tasks/:id/edit(.:format)     project_tasks#edit
         project_project_task GET    /projects/:project_id/project_tasks/:id(.:format)          project_tasks#show
                              PATCH  /projects/:project_id/project_tasks/:id(.:format)          project_tasks#update
                              PUT    /projects/:project_id/project_tasks/:id(.:format)          project_tasks#update
                              DELETE /projects/:project_id/project_tasks/:id(.:format)          project_tasks#destroy
             complete_project PATCH  /projects/:id/complete(.:format)                           projects#complete
                     projects GET    /projects(.:format)                                        projects#index
                              POST   /projects(.:format)                                        projects#create
                  new_project GET    /projects/new(.:format)                                    projects#new
                 edit_project GET    /projects/:id/edit(.:format)                               projects#edit
                      project GET    /projects/:id(.:format)                                    projects#show
                              PATCH  /projects/:id(.:format)                                    projects#update
                              PUT    /projects/:id(.:format)                                    projects#update
                              DELETE /projects/:id(.:format)                                    projects#destroy

视图:

<%= link_to '', complete_project_project_task_path(@project, project_task.id), class: "glyphicon glyphicon-ok", id: "complete-#{project_task.id}", method: :patch %>

控制器动作:

def complete
    @project = Project.find(params[:project_id])
    @project_task = project.project_task.find(params[:id])
    if @project_task.completed_at.blank?
      @project_task.update_attribute(:completed_at, Time.now)
      flash[:success] = 'Task Completed!'
      redirect_to root_path
    else
      @project_task.update_attribute(:completed_at, '')
      flash[:info] = 'Task Updated!'
      redirect_to root_path
    end
  end

我得到的错误是: 没有路由匹配 {:action=>"complete", :controller=>"project_tasks", :id=>nil, :project_id=>"26"} 缺少必需的键:[:id]

在 link_to 中我添加了 2 个参数,@project(获取项目 ID)和 project_task.id。 看来我得到的项目 ID 是正确的,但不是 project_task.id。 我试图将控制器操作更改为 @project_task = ProjectTask.find(params[:id]) 但没有任何运气。 (我还在 link_to 中用不同的参数尝试了一些东西) 我不确定如何找回它,但我希望你们中的一位能为我指出正确的方向。

提前致谢!

看起来您在视图中的 project_task 变量设置不正确。你的代码应该是这样的:

<% @project.project_tasks.each do |project_task| %>
  <%= link_to '', complete_project_project_task_path(@project, project_task.id), class: "glyphicon glyphicon-ok", id: "complete-#{project_task.id}", method: :patch %>
<% end %>

(这考虑了您的 Project 模型 has_many :project_tasks)。

如果设置正确,能否提供完整的视图及其控制器操作?

好的,我知道问题出在哪里了。
我有 2 个版本的 @project_task 实例,这造成了冲突。 (无论是从形式还是从完整的动作) 所以我添加了

<% @project.project_tasks.select(&:persisted?).each do |project_task| %>

解决方法是添加 &:persisted?为了只显示保存的对象。