Ruby on rails 不能';我找不到有';id'=

Ruby on rails 不能';我找不到有';id'=,ruby-on-rails,Ruby On Rails,我有一个嵌套的资源,我正试图用嵌套的资源创建一个表单。新页面可以正常工作,但当我尝试访问该节目时,屏幕上的标题出现了错误。这是我的密码: routes.rb resources :courses do resources :lessons, shallow:true end class LessonsController < ApplicationController before_action :set_lesson, only: [:show, :edit, :update,

我有一个嵌套的资源,我正试图用嵌套的资源创建一个表单。新页面可以正常工作,但当我尝试访问该节目时,屏幕上的标题出现了错误。这是我的密码:

routes.rb

resources :courses do
  resources :lessons, shallow:true
end
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
课程\u控制器.rb

resources :courses do
  resources :lessons, shallow:true
end
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
class lessonscoontroller@course)
回应待办事项|格式|
如果@lesson.save
format.html{将_重定向到@lessue,注意:'已成功创建课程。}
format.json{render:show,status::created,location:@lesson}
其他的
format.html{render:new}
format.json{render json:@lesson.errors,status::unprocessable_entity}
结束
结束
结束
#补丁/放置/课程/1
#PATCH/PUT/lessons/1.json
def更新
回应待办事项|格式|
如果@lesson.update(lesson_参数)
format.html{将_重定向到@lessure,注意:'lessure已成功更新。}
format.json{呈现:显示,状态::确定,位置:@lesson}
其他的
format.html{render:edit}
format.json{render json:@lesson.errors,status::unprocessable_entity}
结束
结束
结束
#删除/课程/1
#删除/lessons/1.json
def销毁
@毁灭
回应待办事项|格式|
format.html{重定向到课程url,注意:'课程已成功销毁。}
format.json{head:no_content}
结束
结束
私有的
#使用回调在操作之间共享公共设置或约束。
def set_课程
@lesson=lesson.find(参数[:id])
结束
def get_课程
@course=course.find(参数[:course\u id])
结束
#永远不要相信来自恐怖网络的参数,只允许白名单通过。
def参数
参数要求(:课程).permit(:代码,:课程id)
结束
结束
如果我还需要补充什么,请告诉我。谢谢

当我试图进入节目时

大概是因为您在routes.rb中定义了
shallow:true
,所以您正在向类似
/lessons/1
的内容发出请求。注意过滤器的顺序:

 before_action :set_lesson, only: [:show, :edit, :update, :destroy]
 before_filter(:get_course)
过滤器按其定义的顺序运行。在这种情况下,
set\u课程
过滤器在
get\u课程
过滤器之前运行。当执行
get_course
过滤器时,它将尝试在params散列中查找课程id。对于“浅”路线,该参数不存在,因此
params[:course_id]
将为
nil
。因此

Course.find(参数[:Course\u id])

引发了一个异常

对于“浅”管线,嵌套资源的ID(课程)是所需的全部。更改课程筛选器以排除“显示”操作:

before\u过滤器:获取课程,除了::show

或者不要使用浅路线


另外,
before\u action
before\u filter

更可取。您可以用参数为错误添加日志文件条目吗?发布您的
rake routes
before\u action:get\u course,除了::index