Reputation: 3
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
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
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