获取当前用户所有职位并查看时路由匹配错误的解决方法
解决路由错误:
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
相关产品推荐
相关产品推荐

