Rails更新报错:Couldn't find Movie with 'id'=:id 问题求助
问题根因
你提交表单时请求地址里的ID是硬编码的占位符:id,没有替换为实际的电影ID,导致控制器无法查询到对应记录。
具体修复步骤
1. 修复edit视图的表单配置
你写的url: '/admin/movies/:id'里的:id只是路由定义时的占位符,Rails不会自动替换为@movie的实际ID,修改为以下任意一种写法即可:
写法1(推荐,用路由辅助方法)
先给路由添加别名,修改routes.rb里的更新路由:
put '/admin/movies/:id', to: 'movies#update', as: :admin_movie
再修改表单代码:
<%= form_with model: @movie, url: admin_movie_path(@movie), method: :put do |form| %>
写法2(直接拼接ID)
<%= form_with model: @movie, url: "/admin/movies/#{@movie.id}", method: :put do |form| %>
2. 修复控制器的其他错误
edit方法里不需要执行@movie.save,这行代码完全多余,直接删除即可update方法里的跳转路径拼写错误,你写的redirect_to :idnex要改为redirect_to :index- 强参数
post_params里不需要permit(:id),更新用的ID是从路由参数params[:id]获取,不会从表单提交的movie参数里取,可直接删除该配置
3. 路由优化建议(可选)
你现在手写全量路由效率很低,直接用Rails内置的资源路由配置就能自动生成所有增删改查路由,替换你现有的路由代码即可:
Rails.application.routes.draw do namespace :admin do resources :movies end end
配置后表单可以进一步简化,不需要手动写url和method参数:
<%= form_with model: [:admin, @movie] do |form| %>
内容的提问来源于stack exchange,提问作者Beginner Professional
相关产品推荐
相关产品推荐

