hpx2331
hpx2331

Reputation: 3

No route matches {:action=>"new", :controller=>"lessons"} missing required keys: [:course_id]

I am new to Ruby on Rails.I am facing a problem using nested resources.

I am building a learning app where there are courses and lessons. Every course will have many lessons and a lesson belongs to only one course.

I am unable to create a lesson for a course currently.

Example : http://localhost:3000/courses/19/lessons/new is a page where i want to create and display lessons for course 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 %>  

Upvotes: 0

Views: 858

Answers (2)

SnehaT
SnehaT

Reputation: 309

First change you need to make in your Course model as you have singular lesson when defining many association:

has_many :lessons

Also let me know if their are any chances of lessons page being called without courses? If no then please remove:

resources :lessons

I guess also the two defining of courses in routes in creating issue. Please try removing the:

resources :courses

Let me know if you still face any issue.

Upvotes: 1

Jagdeep Singh
Jagdeep Singh

Reputation: 4920

One problem i see is that you have defined route resources :lessons twice. Once, inside courses scope and second time outside.

The error seems to occur because in your view @course is nil. So, please check you set @course in a before_action inside lessons_controller#new action.

EDIT

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

Also replace has_many :lesson with has_many :lessons inside Course model.

Upvotes: 1

Related Questions