param丢失或值为空:module_list

时间:2015-12-11 03:29:33

标签: ruby-on-rails

我正在尝试输入一个新模块的列表,当我按下“新模块列表”时,我应该将表单填入其中以便从标题中输出错误。应用程序跟踪指向底部,代码位于“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

Rake路线截图 enter image description here

1 个答案:

答案 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

然后添加一种方法来挑选哪个学生将其与表格联系起来。