You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取当前用户所有职位并查看时路由匹配错误的解决方法

解决路由错误:No route matches missing required keys: [:id]

这个错误的核心原因是你在遍历用户的Job时,包含了未保存到数据库的Job对象(这类对象的id为nil),导致生成show链接时无法提供路由必需的:id参数。下面是一步步的修复方案:


1. 先排查视图中的无效Job记录

首先,临时在视图中添加调试代码,确认是否存在id为nil的Job:

<% current_user.jobs.each do |j| %>
  <%# 临时调试:查看Job的完整属性 %>
  <%= j.inspect %>
  <%= j.id %> 
  <%= j.job_category %> 
  <%= link_to 'show', job_path(j.id) %> 
  <br> <br> 
<% end %>

如果输出中出现类似#<Job id: nil, ...>的记录,说明确实存在未保存的Job对象——这类对象是创建失败(比如验证不通过)时被留在了用户的关联集合里,但并没有真正存入数据库。

修复视图:只遍历已保存的Job

修改循环逻辑,只处理已持久化到数据库的Job:

<% current_user.jobs.persisted.each do |j| %>
  <%= j.id %> 
  <%= j.job_category %> 
  <%# 直接传Job对象更安全,Rails会自动提取id %>
  <%= link_to 'show', job_path(j) %> 
  <br> <br> 
<% end %>

persisted?是ActiveRecord的内置方法,会判断对象是否已保存到数据库(有有效id且未被销毁),这样就能过滤掉无效的Job记录。


2. 修复Job创建逻辑,避免无效对象残留

你的JobsController#create方法用了@user.jobs.create,这个方法会返回创建后的对象——如果创建失败(比如验证不通过),对象会被留在@user.jobs的内存集合中,导致用户详情页遍历到无效记录。

修改create方法,手动处理保存结果:

class JobsController < ApplicationController
  # ...其他方法...
  def create
    @user = User.find(params[:user_id])
    @user_job = @user.jobs.build(joblists_params) # 先构建对象,不直接保存
    if @user_job.save
      flash[:notice] = "Job has been successfully Created"
      redirect_to user_path(@user)
    else
      # 保存失败时显示错误信息,避免用户不知情
      flash[:alert] = "Failed to create job: #{@user_job.errors.full_messages.join(', ')}"
      # 如果是从表单页面提交的,建议渲染表单页面让用户修正错误
      # render :new
      # 或者跳回用户详情页
      redirect_to user_path(@user)
    end
  end
  # ...其他方法...
end

用build代替create,再手动判断保存结果,这样未通过验证的Job不会被自动添加到用户的关联集合中。


3. 额外检查:Job模型的验证规则

如果创建Job经常失败,检查你的Job模型是否有必填字段未设置验证提示,比如:

class Job < ApplicationRecord
  belongs_to :user
  validates :job_title, :job_category, presence: true
  # ...其他验证...
end

确保用户创建Job时能看到明确的错误提示,避免反复生成无效记录。


完成以上修改后,重新创建一个Job并测试:用户详情页的show链接会生成正确的/jobs/[id]路径,点击后就能正常访问Job详情页了。

内容的提问来源于stack exchange,提问作者Prince Abalogu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:18:13