Rails如何更新null值字段?给Project关联Bug时参数缺失报错如何解决
问题根源
- 关联逻辑设计错误:
Project对Bug是一对多关联,外键project_id应该存在bugs表中,projects表不需要加bug_id字段,单个bug_id字段也无法存储一个项目对应的多个bug id - 报错触发原因:
edit_task_params方法强制要求请求参数里携带project根节点,你提交新建bug的表单时没有传递对应结构的参数,直接抛出参数缺失错误 - 代码逻辑冗余错误:你在
@bug还没执行save操作前就调用@bug.id,此时id还是空值没有实际意义;同时多次重复查询、更新Project对象完全无用
修复步骤
- 回滚删除你之前给
projects表添加的bug_id字段,这个字段完全不需要存在 - 确认
bugs表已经存在project_id整型字段,没有的话生成迁移文件补充添加 - 重写
BugController的逻辑,删除无用代码:
class BugController < ApplicationController def new # 新建bug的页面路径需要携带project_id,路由嵌套在project下即可 @project = Project.find(params[:project_id]) @bug = Bug.new end def create # 先查询要关联的项目 @project = Project.find(params[:project_id]) # 通过关联关系创建bug,自动赋值project_id @bug = @project.bugs.build(bug_params) @bug.user_id = current_user.id respond_to do |format| if @bug.save format.html { redirect_to new_project_bug_path(@project), flash: { success: "bug added"} } else format.html { render :new } end end end private def bug_params params.require(:bug).permit(:title, :description, :screen_shot, :typeOf, :status_is, :deadline) end # 完全删除没用的edit_task_params方法 end
- 调整路由配置,嵌套bug路由到project下:
# config/routes.rb resources :projects do resources :bugs end
- 修改新建bug的表单配置,自动携带project_id参数:
# app/views/bugs/new.html.erb <%= form_with model: [@project, @bug] do |form| %> <!-- 原有表单字段保持不变 --> <% end %>
修改完成后创建bug会自动关联对应项目,支持同一个项目关联多个bug,不会再触发参数缺失报错。
内容的提问来源于stack exchange,提问作者smith
相关产品推荐
相关产品推荐

