我有一个嵌套资源,我试图用嵌套资源创建一个表单。新页面有效,但是当我尝试访问该节目时,我会在标题上看到错误。这是我的代码:
的routes.rb
resources :courses do
resources :lessons, shallow:true
end
lessons_controller.rb
class LessonsController < ApplicationController
before_action :set_lesson, only: [:show, :edit, :update, :destroy]
before_filter(:get_course)
# GET /lessons
# GET /lessons.json
def index
@lessons = Lesson.all
end
# GET /lessons/1
# GET /lessons/1.json
def show
end
# GET /lessons/new
def new
@lesson = Lesson.new
end
# GET /lessons/1/edit
def edit
end
# POST /lessons
# POST /lessons.json
def create
@course = Course.find(params[:course_id])
@lesson = Lesson.new(:course=>@course)
respond_to do |format|
if @lesson.save
format.html { redirect_to @lesson, notice: 'Lesson was successfully created.' }
format.json { render :show, status: :created, location: @lesson }
else
format.html { render :new }
format.json { render json: @lesson.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /lessons/1
# PATCH/PUT /lessons/1.json
def update
respond_to do |format|
if @lesson.update(lesson_params)
format.html { redirect_to @lesson, notice: 'Lesson was successfully updated.' }
format.json { render :show, status: :ok, location: @lesson }
else
format.html { render :edit }
format.json { render json: @lesson.errors, status: :unprocessable_entity }
end
end
end
# DELETE /lessons/1
# DELETE /lessons/1.json
def destroy
@lesson.destroy
respond_to do |format|
format.html { redirect_to lessons_url, notice: 'Lesson was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_lesson
@lesson = Lesson.find(params[:id])
end
def get_course
@course = Course.find(params[:course_id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def lesson_params
params.require(:lesson).permit(:code, :course_id)
end
end
如果我需要添加任何其他内容,请告诉我。谢谢!
答案 0 :(得分:2)
当我尝试访问节目时
据推测,由于您已在routes.rb中定义了shallow: true
,因此您正在向/lessons/1
之类的请求发出请求。请注意过滤器的顺序:
before_action :set_lesson, only: [:show, :edit, :update, :destroy]
before_filter(:get_course)
过滤器按照定义的顺序运行。在这种情况下,set_lesson
过滤器会在get_course
过滤器之前运行。执行get_course
过滤器时,它将尝试在params散列中查找course_id。在&#34;浅&#34;路由,该参数不存在,因此params[:course_id]
将为nil
。因此
Course.find(params[:course_id])
提出异常。
对于&#34;浅&#34; route,嵌套资源的ID(课程)就是所需要的。更改课程过滤器以排除show动作:
before_filter :get_course, except: :show
或者不要使用浅路线。
此外,before_action
优先于before_filter
。