表单保存引用ID,如NULL

时间:2013-12-26 16:16:53

标签: ruby-on-rails simple-form

我是rails的新手,我的情节如下:

class Quiz < ActiveRecord::Base
  has_many :questions, dependent: :destroy
end

class Question < ActiveRecord::Base
  belongs_to :quiz
end

class CreateQuizzes < ActiveRecord::Migration
  def change
    create_table :quizzes do |t|
      t.string :name
      t.timestamps
    end
  end
end

class CreateQuestions < ActiveRecord::Migration
  def change
    create_table :questions do |t|      
      t.text :question
      t.references :quiz, index: true
      t.timestamps
    end
  end
end

然后当我尝试使用simple_form创建一个新问题时,它正在工作但是将对象问题保存在数据库中,其中quiz_id就像NULL一样,这里是控制器和我正在使用的simple_form:

//CONTROLLER
class QuestionsController < ApplicationController
  def new
    @quiz = Quiz.find(params[:quiz_id])
    @question = Question.new
  end

  def create
    @question = Question.new(params[:question].permit!)
    if @question.save
      redirect_to quiz_path(@quiz)
    else
      redirect_to error_path
    end
  end

end

//RESOURCES
resources :quizzes do
  resources :questions
end


//VIEW
= simple_form_for([@quiz, @quiz.questions.build]) do |f|
  .container
      .form-group
        = f.input :question, :placeholder => "Question..."
      .submit
        = f.submit "Create", :class => "btn btn-default"

如何创建此表单并使用正确的quiz_id引用保存问题对象?

2 个答案:

答案 0 :(得分:0)

您需要在控制器中明确告知您想要问题的测验。 Rails不想假设你想如何处理数据。

@quiz = Quiz.find(params[:quiz_id]
@question = @quiz.questions.new(params[:question.permit!)

答案 1 :(得分:0)

question中的params哈希不包含quiz_id,但params确实在该哈希值之外包含此信息。

你可以这样做:

@quiz = Quiz.new(params[quiz_id])
@question = @quiz.questions.new(params[:question].permit!)

这也可以避免在redirect_to quiz_path(@quiz)中无法重定向,因为此操作中未定义@quiz,并且不会在操作之间保存变量。

顺便说一句,将此行添加到layouts/application.html.haml非常有用,这样您就可以看到params hash:=debug(params) if Rails.env.development?