我是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引用保存问题对象?
答案 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?