我是Rails的新手,我一直在努力解决这个想法,但是我无法理解。例如,我有
class Survey < ActiveRecord::Base
has_many :questions
end
class Question < ActiveRecord::Base
belongs_to :survey
end
我创建了一组调查。现在我想创建一些问题,并通过其外键survey_id将其分配给调查。在问题new.html.erb页面中,我使用高级表单来显示调查ID(我跟着this tutorial)。它工作正常但是,当我点击提交时,似乎survey_id没有保存。
这是我的question_controller.rb
def create
@question = Question.create(question_params)
respond_to do |format|
if @question.save
format.html { redirect_to @question, notice: 'Question was successfully created.' }
else
format.html { render :new }
end
end
def question_params
params.require(:question).permit(:description, :date_created, :survey_id)
end
以下是表格:
<%= form_for(@question) do |f| %>
<div class="field">
<%= f.label :survey_id %><br>
<%= collection_select(:question, :survey_id, Survey.all, :id, :description, prompt: true ) %>
</div>
<% end %>
我知道为了使其工作,我必须做类似
的事情@question = @survey.questions.create(...)
但我不知道在用户点击下拉列表并选择适当的调查之前如何获取@survey实例。
任何人都知道如何做到这一点??
答案 0 :(得分:2)
您已创建调查对象,并希望它们与问题相关联,
因此,如果您使用带有调查名称的选择下拉列表进行选择,则在您的问题表单中设置选择选项值以调查ID 。因此,您的question params
将包含survey_id
参数,其值等于所选调查的ID。因此Question.create(question_params)
将使用survey_id创建问题。
答案 1 :(得分:2)
您的创建方法应为
def create
@survey = Survey.find(params[:survey_id])
@question = @survey.questions.create(question_params)
respond_to do |format|
if @question.save
format.html { redirect_to @question, notice: 'Question was successfully created.' }
else
format.html { render :new }
end
end
或者您也可以使用过滤器
class QuestionsController < ApplicationController
before_filter :set_survey, only: :create
def create
@question = @survey.questions.create(question_params)
respond_to do |format|
if @question.save
format.html { redirect_to @question, notice: 'Question was successfully created.' }
else
format.html { render :new }
end
end
private
def set_survey
@survey = Survey.find(params[:survey_id]) || Survey.new
end
end