Ruby on rails Rails关联-通过表单创建一个新记录

Ruby on rails Rails关联-通过表单创建一个新记录,ruby-on-rails,ruby,associations,Ruby On Rails,Ruby,Associations,我有一个课程模式: class Course < ApplicationRecord has_many :sub_courses validates :title, presence: true # Course associated to SubCourse via 'sub_course_id' on Course table end class SubCourse < ApplicationRecord belongs_to :course # Su

我有一个课程模式:

class Course < ApplicationRecord
  has_many :sub_courses

  validates :title, presence: true

  # Course associated to SubCourse via 'sub_course_id' on Course table
end
class SubCourse < ApplicationRecord
  belongs_to :course

  # SubCourse associated to Course via 'course_id' on SubCourse table
end

新建sub_课程页面
sub_课程.new.html
表单

= form_for @sub_course, url: admin_sub_courses_path do |f|
  = f.label :title
  = f.text_field :title
  = f.label :description
  = f.text_field :description
  = f.submit
当转到sub-course new页面时,我看到错误
No route matches[POST]“/admin/sub\u courses/new”

我的
sub\u course\u controller.rb
如下所示:

def new
    @course = Course.find(params.require(:course_id))
    @sub_course = @course.sub_course.new
  end

  def create
    if @sub_course.save
      redirect_to admin_sub_courses_path, notice: "saved"
    else
      render "new"
    end
  end
namespace :admin do
    resources :courses, { :only => [:index, :new, :create, :edit, :destroy, :update, :show] }
    resources :sub_courses 
  end
  create_table "courses", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "title"
    t.string "description"
    t.integer "sub_course_id"
  end

  create_table "sub_courses", force: :cascade do |t|
    t.string "title"
    t.text "description"
    t.string "question"
    t.string "possible_answer"
    t.string "correct_answer"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "course_id"
  end
我的路线是这样的:

def new
    @course = Course.find(params.require(:course_id))
    @sub_course = @course.sub_course.new
  end

  def create
    if @sub_course.save
      redirect_to admin_sub_courses_path, notice: "saved"
    else
      render "new"
    end
  end
namespace :admin do
    resources :courses, { :only => [:index, :new, :create, :edit, :destroy, :update, :show] }
    resources :sub_courses 
  end
  create_table "courses", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "title"
    t.string "description"
    t.integer "sub_course_id"
  end

  create_table "sub_courses", force: :cascade do |t|
    t.string "title"
    t.text "description"
    t.string "question"
    t.string "possible_answer"
    t.string "correct_answer"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "course_id"
  end
我如何成功创建一个sub_课程,该课程自动与我来自的原始展示页面中的课程关联

架构结构如下所示:

def new
    @course = Course.find(params.require(:course_id))
    @sub_course = @course.sub_course.new
  end

  def create
    if @sub_course.save
      redirect_to admin_sub_courses_path, notice: "saved"
    else
      render "new"
    end
  end
namespace :admin do
    resources :courses, { :only => [:index, :new, :create, :edit, :destroy, :update, :show] }
    resources :sub_courses 
  end
  create_table "courses", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "title"
    t.string "description"
    t.integer "sub_course_id"
  end

  create_table "sub_courses", force: :cascade do |t|
    t.string "title"
    t.text "description"
    t.string "question"
    t.string "possible_answer"
    t.string "correct_answer"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "course_id"
  end
运行子球场的耙道后:

admin_sub_courses GET    /admin/sub_courses(.:format)                                                             admin/sub_courses#index
                          POST   /admin/sub_courses(.:format)                                                             admin/sub_courses#create
     new_admin_sub_course GET    /admin/sub_courses/new(.:format)                                                         admin/sub_courses#new
    edit_admin_sub_course GET    /admin/sub_courses/:id/edit(.:format)                                                    admin/sub_courses#edit
         admin_sub_course GET    /admin/sub_courses/:id(.:format)                                                         admin/sub_courses#show
                          PATCH  /admin/sub_courses/:id(.:format)                                                         admin/sub_courses#update
                          PUT    /admin/sub_courses/:id(.:format)                                                         admin/sub_courses#update
                          DELETE /admin/sub_courses/:id(.:format)                                                         admin/sub_courses#destroy

首先,我要检查
rake routes | grep sub_课程
的结果

不过,乍一看,在我看来,在
sub_课程
controller中存在一个赋值问题。 我将尝试如下重构它:

  before_action :set_course, only: [:new, :create]

  def new
     @sub_course = @course.sub_courses.new 
  end

  def create
     @sub_course = @course.sub_courses.new(sub_course_params)
     if @sub_course.create!(sub_course_params)
      redirect_to admin_sub_courses_path, notice: "saved"
    else
      render "new"
    end
  end

private

def sub_course_params
  params.require(:sub_course).permit(:title, :description, :question, :possible_answer, :correct_answer, :course_id)
end

def set_course
 @course = Course.find(params[:course_id])
end
如您所见,我删除了带有
Course.find(params.require(:Course_id))
的行,该行使用了通过params查找记录的正确语法。 强参数使用
params.require
语法,需要定义强参数,以便实际将表单中的数据持久化到数据库中的记录中


然后,我将
@course
作业移动到一个私有方法
set_course
,这样作业只完成一次,并由需要它的方法共享。

不幸的是,这并不能解决我的问题。仍然遇到错误
No route matches[POST]“/admin/sub_courses/new”
我用grep路线更新了最初的帖子