缺少必需的键:更新嵌套元素时 [: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?为了只显示保存的对象。
首先非常感谢你帮助我。
我正在开发一个项目工具,其中我有一个 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?为了只显示保存的对象。