2016-07-15 110 views
0

我是Ruby on Rails的新手。我正面临使用嵌套资源的问题。没有路由匹配{:action =>“new”,:controller =>“lessons”}缺少必需的键:[:course_id]

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

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

示例: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 %> 

回答

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 :lessons取代has_many :lessonCourse模型。

+0

资源:我做过两次的课程,因为如果我删除第二个资源:课程,它会给我一个lessons_path找不到的错误。 感谢您的帮助,我会尝试一下@JagdeepSingh –

+0

我与模型 –

+0

另一件事的建议再次编辑它,你可以跳过所有的“分号”红宝石 –

1

你定义一对多关联的时候需要在你的课程模式,让你有奇异的教训第一个变化:

has_many :lessons 

也让我知道,如果他们是被称为没有课程的课程页面的任何机会?如果没有,请删除:

resources :lessons 

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

resources :courses 

让我知道你是否仍然面临任何问题。

+0

我删除了:resources:courses并没有遇到任何错误。但是,当我删除资源:课程时,我收到一条错误消息:没有路由匹配[POST]“/ lessons” –

+0

您是否在任何地方单独使用课程?如果你正在使用它,那么请不要删除并尝试它是否工作... – SnehaT

+0

尝试保留课程,但错误仍然是一样的。 –

相关问题