2015-06-09 82 views
0

我在第一个Ruby on Rails应用程序中使用了嵌套模型,现在我遇到了一个问题。我有一个has_many的调查模型:问题依次属于:调查和模型问题has_many:答案。我的答案模型然后属于:问题。从check_box更新属性

现在我想更新一个布尔属性:在我的:answers控制器中猜测。为此我创建了一个新的动作:quiz_guess看起来像这样:

 def quiz_guess 
     Answer.update(params[:id], guess: false) 
      puts("Guess saved") 
     redirect_to(:action => 'show', :id => @survey.next, :survey_id => @survey.id) 
     end 

我的看法是这样的:

<%= form_tag quiz_guess_questions_path, :method => :put do %> 
     <% for question in @survey.questions do %> 
     <li><%= h question.content %></li> 
      <% for answer in question.answers do %> 
       <li><%= h answer.content %> 
        <%= form_for :guess do |f| %> 
        <%= f.check_box(:guess, :method => :put) %> 
        <% end %> 
       </li> 
      <% end %> 
     <% end %> 
    <% end %> 

显然我读过documentation,以及本blog post ,但我不明白如何在我的控制器和视图中实现它。

有了这段代码,我无法更新正确的:guess属性,而是更新了另一个(使用不同的:id)。任何人都可以阐明我做错了什么?

+0

您可以使用Ajax更新记录 –

+0

当然,我会看看成说。 – ljnissen

回答

0

我终于看到了这个Railscast,Ryan Bates在这里展示了如何用fields_for更新多个属性。这是我的新观点:

<%= form_tag quiz_guess_questions_path, :method => :put do %> 
    <% for question in @survey.questions do %> 
     <li><%= question.content %></li> 
     <% for answer in question.answers do %> 
      <li> 
      <%= fields_for "answers[]", answer do |f| %> 
       <%= answer.content %> 
       <%= f.check_box :guess %>  
      <% end %> 
      </li> 
     <% end %> 
    <% end %> 
    <%= submit_tag "Guess" %> 
    <% end %> 

和我的新控制器:

def quiz_guess 
    Answer.update(params[:answers].keys, params[:answers].values) 
    flash[:notice] = "Guess saved successfully." 
    redirect_to questions_url 
    end