我正在尝试输入一个新模块的列表,当我按下“新模块列表”时,我应该将表单填入其中以便从标题中输出错误。应用程序跟踪指向底部,代码位于“def module_list_params”内部,也位于“def set_student”所在的位置。我不知道它为什么要这样做。我在铁轨上使用红宝石。
class ModuleListsController < ApplicationController
before_action :set_module_list, only: [:show, :edit, :update, :destroy]
before_action :set_student, only: [:new, :create]
# GET /module_lists
# GET /module_lists.json
def index
@module_lists = ModuleList.all
end
# GET /module_lists/1
# GET /module_lists/1.json
def show
end
# GET /module_lists/new
def new
@module_list = @student.module_lists.new
end
# GET /module_lists/1/edit
def edit
end
# POST /module_lists
# POST /module_lists.json
def create
@module_list = @student.module_lists.new(module_list_params)
respond_to do |format|
if @module_list.save
format.html { redirect_to @module_list, notice: 'Module successfully created.' }
format.json { render :show, status: :created, location: @module_list }
else
format.html { render :new }
format.json { render json: @module_list.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /module_lists/1
# PATCH/PUT /module_lists/1.json
def update
respond_to do |format|
if @module_list.update(module_list_params)
format.html { redirect_to @module_list, notice: 'Module list was successfully updated.' }
format.json { render :show, status: :ok, location: @module_list }
else
format.html { render :edit }
format.json { render json: @module_list.errors, status: :unprocessable_entity }
end
end
end
# DELETE /module_lists/1
# DELETE /module_lists/1.json
def destroy
@module_list.destroy
respond_to do |format|
format.html { redirect_to module_lists_url, notice: 'Module list was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_module_list
@module_list = ModuleList.find(params[:id])
end
def module_list_params
params.require(:module_list).permit(:student_id, :title, :description, :credit_value)
end
def set_student
@student = Student.find_by(id: params[:student_id]) ||
Student.find(module_list_params[:student_id])
end
end
答案 0 :(得分:0)
我相信您的问题是before_action :set_student, only: [:new, :create]
行。当您使用表单转到页面时,set_student
正在运行,但由于URL中没有包含student_id
,因此无法找到任何设置它的内容。
要创建依赖对象,有两种主要方法:您可以将表单页面绑定到特定父对象,即/students/4/module_lists/new
,在这种情况下,提交表单将创建一个绑定到的模块列表ID为4的学生。另一种方法是使一般形式不与任何特定的父对象相关联,以某种方式在表单中选择父级,例如选择或某种东西。在这种情况下,网址就像/module_lists/new
。
如果您想转到第一条路线,您需要将resources :module_lists
嵌套在students
内。查看docs了解如何执行此操作,但基本上看起来像
resources :students do
resources :module_list
end
然后在link_to
点击进入该页面,您需要传递student_id
:
link_to 'Create Module List', new_student_module_list_path(@student)
对于第二个选项,您只需从before_action中删除:new
,将new
方法更改为
def new
@module_list = ModuleList.new
end
然后添加一种方法来挑选哪个学生将其与表格联系起来。