嵌套表单has_many模型。如何从嵌套项获取id?

时间:2010-10-05 12:47:46

标签: model ruby-on-rails-3

我有一个嵌套的表单,结构化:问题has_many答案。所以,问题是多种选择。

当前表单视图:

- semantic_form_for @question do |f|
  = f.error_messages
  - f.inputs do
    = f.input :question
    = f.semantic_fields_for :answers do |builder|
      = builder.input :content, :label => "Answer", :input_html => { :class => {'required', ' ckeditor'}}
    = f.buttons

我的问题控制器看起来像:

  def new
    @question = Question.new
    4.times { @question.answers.build }
  end

  def create
    @question = Question.new(params[:question])
    @question.user_id = current_user.id
    if @question.save
      flash[:notice] = "Question added."
      redirect_to questions_url
    else
      render :action => 'new'
    end
  end

一切都很简单。但是,现在我想在添加时“选择”正确答案,最好是在同一页面上。我想我会在包含某种'CorrectAnswerId'的问题中添加一个新列。但是,我怎样才能在视图和视图中添加它。控制器?

1 个答案:

答案 0 :(得分:1)

我假设您使用某种复选框方法来表示“这是正确答案”。

在这种情况下,您可以让复选框包含答案的ID,然后在create上,您可以将correct_answer_id列设置为该复选框的ID值。

但是,由于此时尚未保存您的答案(构建仅在内存中创建对象),因此在答案已保存之前您没有ID。最简单的解决方案是在答案表中将答案标记为正确,而不是在问题表中。然后,您可以在Question模型中创建一个方法,如:

def correct_answer
    @correct ||= answers.where(:is_correct => true)
end

如果需要,还可以让您能够获得多个正确的答案。 如果这不是必需的,您可以随时将.first添加到查询字符串的末尾,以便返回一个答案而不是一组正确的答案。