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路线更新了最初的帖子