Rails在表单中保存用户选择的外键

时间:2015-01-05 10:35:40

标签: ruby-on-rails

我是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实例。

任何人都知道如何做到这一点??

2 个答案:

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