2010-10-05 113 views
0

我有一个嵌套的窗体,结构化:Question has_many Answers。所以,这些问题是多种选择。嵌套形式has_many模型。如何从嵌套项目获取ID?

当前表单视图:

- 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

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

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

但是,因为您的答案在此时尚未保存(构建仅在内存中创建对象),所以直到答案已保存为止,您才会拥有该ID。最简单的解决方案只是在答案表中将答案标记为正确,而不是在问题表中。然后,你可能会在Question创建模型的方法,如:

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

这也将给你以允许多个正确答案,如果你需要它的能力。 如果这不是真的有必要,您可以随时将.first添加到查询字符串的末尾,以便返回一个答案而不是正确答案的数组。

+0

thx lukas!完美无缺地工作。我做了一个简单的jquery检查,以确保一次只检查一个复选框,也可以工作! :) – 2010-10-08 16:40:57