我是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 %>
答案 0 :(得分:1)
我看到的一个问题是你已经定义了两次路由resources :lessons
。一次,在courses
范围内,第二次在外面。
错误似乎发生,因为在您的视图中@course
为零。因此,请检查您在@course
内before_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
如果您仍然遇到任何问题,请告诉我。