没有路由匹配{:action =>“new”,:controller =>“lessons”}缺少必需的键:[:course_id]

时间:2016-07-15 06:48:37

标签: ruby-on-rails ruby-on-rails-4

我是Ruby on Rails的新手。我在使用嵌套资源时遇到了问题。

我正在构建一个有课程和课程的学习应用程序。 每门课程都会有很多课程,而且课程只属于一门课程。

我目前无法为课程创建课程。

示例:http://localhost:3000/courses/19/lessons/new是我想要创建和显示课程19的课程的页面。

的routes.rb

Rails.application.routes.draw do

  devise_for :users

  resources :courses


  resources :courses do

    resources :lessons

  end

  resources :lessons

  root 'pages#landing'

  get 'pages/home' => 'pages#home' ,as: :home

  get '/user/:id' => 'pages#profile',as: :profile

  get '/users' => 'courses#index',as: :user_root

end

Course.rb

class Course < ActiveRecord::Base

  belongs_to :user

  has_many :lesson

  validates :user_id , presence: true

end

Lesson.rb

class Lesson < ActiveRecord::Base

  belongs_to :course

  validates :course_id , presence: true

end

CourseController.rb

class CoursesController < ApplicationController

  def index

    @courses = Course.all;

  end

  def new

    @course = Course.new;

  end


  def create

    @course = Course.new(course_params);

    @course.user_id = current_user.id;

    if @course.save

      redirect_to course_path(@course)

    else

      flash[:notice]="Course could not be created ! "

      redirect_to new_course_path
  end

end

  def edit

  end

  def update

  end

  def destroy

    @course = Course.find(params[:id]);

    @course.destroy;

  end

  def show

    @course = Course.find(params[:id]);

  end


private

  def course_params

      params.require(:course).permit(:title, :description, :user_id)

  end

end

LessonController.rb

class LessonsController < ApplicationController



    def index

        @lessons = Lesson.all;

      end


      def new

        @lesson = Lesson.new;

      end


      def create

        @lesson = Lesson.new(lesson_params);

        @course = Course.find_by(id: [params[:course_id]]);

        if @lesson.save

          redirect_to new_course_lesson_path , flash[:notice] = "Lesson successfully saved !"

        else

          redirect_to new_course_lesson_path , flash[:notice] = "Lesson cannot be created ! "

        end

      end


      def show

        @lesson = Lesson.find(params[:id])

      end


      private

      def lesson_params

        params.require(:lesson).permit(:title,:description,:video,:course_id)

      end


    end

Lessonform.html.erb

<%= form_for ([@course,@lesson]) do |f| %>

<%= f.label :lesson_Title %>  

<%= f.text_field :title ,placeholder: "Enter the lesson Title" ,:class=>"form-control" %><br />  

<%= f.label :Description %>  

<%= f.text_area :description ,placeholder: "Enter the lesson Description",rows:"8",:class=>"form-control" %><br />  

<center>  
<%= f.submit "Create lesson",:class =>"btn btn-lg btn-primary" %>  
</center>  

<% end %>  

2 个答案:

答案 0 :(得分:1)

我看到的一个问题是你已经定义了两次路由resources :lessons。一次,在courses范围内,第二次在外面。

错误似乎发生,因为在您的视图中@course为零。因此,请检查您在@coursebefore_action行动中设置lessons_controller#new

修改

class LessonsController < ApplicationController
  before_action :set_course, only: [:new, :create]

  def new
    @lesson = @course.lessons.build
  end

  private

  def set_course
    @course = Course.find_by(id: params[:course_id])
  end
end

同时将has_many :lesson替换为has_many :lessons模型中的Course

答案 1 :(得分:1)

首先需要在课程模型中进行更改,因为在定义多个关联时您需要单独学习:

has_many :lessons

另请告诉我他们是否有机会在没有课程的情况下调用课程页面?如果没有,请删除:

resources :lessons

我想也是创建问题时路线中两门课程的定义。请尝试删除:

resources :courses

如果您仍然遇到任何问题,请告诉我。