Rails嵌套路由下关联模型Schedule新建时如何获取Movie的id
问题根因
你在嵌套路由场景下,父资源Movie的ID参数名是movie_id而非id,之前使用params[:id]无法匹配到对应值,导致@movie为空才触发报错。
修复步骤
1. 修正SchedulesController代码
新增前置回调统一获取Movie实例,补充参数校验和异常处理逻辑:
class SchedulesController < ApplicationController # 给需要关联Movie的动作加前置查询 before_action :set_movie, only: [:new, :create] def new @schedule = @movie.schedules.build end def create @schedule = @movie.schedules.build(schedule_params) if @schedule.save # 跳转路径可根据业务需求调整,示例跳转到电影列表页 redirect_to admin_movies_path, notice: '场次创建成功' else # 保存失败则返回新建页面回显报错 render :new end end private def set_movie # 用嵌套路由规范的movie_id参数取值 @movie = Movie.find(params[:movie_id]) end # 补充Strong参数配置,放行允许提交的字段 def schedule_params params.require(:schedule).permit(:start_time, :end_time) end end
2. 修正View表单路径
嵌套路由场景下直接传入父资源和子资源实例数组,Rails会自动生成正确的提交地址,不需要手动写url参数:
把原代码里的
<%= form_with model: @schedule, url: movie_schedules_path do |form| %>
修改为
<%= form_with model: [@movie, @schedule] do |form| %>
内容的提问来源于stack exchange,提问作者Beginner Professional
相关产品推荐
相关产品推荐

