无法获取关联模型ID:Reports控制器遇ActiveRecord::RecordNotFound报错
解决ActiveRecord::RecordNotFound报错的方案
这个报错的核心原因是系统找不到id为空的Patient,说明在跳转新建报告页面时,patient_id参数没有正确传递,或者你的代码逻辑存在几个关键问题,我来一步步帮你排查修复:
1. 修正患者详情页的权限判断逻辑
你当前的判断条件<% if @patient.id == current_user.id %>明显不对——患者的id是患者自身的标识,而current_user是创建该患者的医生,两者的id不可能相等。你应该检查这个患者是否属于当前登录用户,所以要改成:
<% if signed_in? %> <% if @patient.user_id == current_user.id %> <%= link_to "Add Visit Report", new_patient_report_path(@patient), class: "button_one" %> <% end %> <% end %>
这里用了嵌套路由的路径助手new_patient_report_path,后面会解释为什么要用嵌套路由。
2. 配置正确的嵌套路由
为了让报告和患者建立明确的关联,建议在config/routes.rb里设置嵌套路由,这样路由会自动传递patient_id参数:
resources :patients do resources :reports, only: [:new, :create] # 只开放需要的动作 end
执行rails routes可以看到生成的路由,其中新建报告的路由会是/patients/:patient_id/reports/new,这样参数会自动包含patient_id。
3. 修复ReportsController的new方法
现在在app/controllers/reports_controller.rb的new方法里,就能正确获取到患者了:
def new # 通过嵌套路由传递的patient_id找到对应的患者 @patient = Patient.find(params[:patient_id]) # 基于该患者新建报告,自动关联patient_id @report = @patient.reports.build end
4. 额外检查:确保患者详情页的@patient存在
最后确认PatientsController的show方法正确获取了患者:
def show @patient = Patient.find(params[:id]) end
经过这几步调整,就能解决找不到Patient的报错,同时确保只有患者的所属医生才能创建报告。
内容的提问来源于stack exchange,提问作者user9409047
相关产品推荐
相关产品推荐

