0

私は割り当てと呼ばれるモデルを持っています。これは、多肢選択式クイズ アプリでのユーザーと質問の間の豊富な結合を表しています。ユーザーが質問に答えると、応答は割り当てコントローラーの次の更新メソッドに記録されます

    デフォルト編集
        @assignment = Assignment.find_by_id(params[:id])
        @user = @assignment.user
        @question = @assignment.question
        puts "ユーザー #{@user} 質問 #{@question} 課題 #{@assignment}"
      終わり

    デフォルト更新
        @assignment = Assignment.find(params[:id])
        @user = @assignment.user
        @assignment.update_attributes(:response => params[:assignment][:response])
        @assignment.save の場合
          flash[:notice] = "あなたの回答は保存されました"
          redirect_to(:action => 'show', :id => @assignment.id , :user_id => @user.id)
        そうしないと
          puts @assignment.save
          puts 「保存できませんでした」
          render(user_assignment_path(@user, @assignment) , :html => {:method => :get})
        終わり
      終わり

呼び出されるグレードと呼ばれる保存前があります。モデルは次のとおりです。

 

    クラス代入 ActiveRecord::Base
      所属先:ユーザー
      所属先:質問
      attr_accessible :title, :body, :user_id, :question_id , :response
      before_save :グレード


      デフグレード
        self.correct = (response == self.question.solution) 応答 == nil でない限り
      終わり
    終わり

そのため、初めて応答を送信すると、保存は完全に機能し、それに応じてリダイレクトされます。その後、質問を再度編集してフォームを再送信しようとすると、保存に失敗します。

これが発生している理由を考えられる人はいますか?

さらに、2 番目のリダイレクトにエラーがあることはわかっています。

編集 誰かがここで何か間違ったことを見つけた場合に備えて、編集 erb を次に示します。上記のコントローラーに edit メソッドも追加しました。

<div class="admin-display">
  <%if @admin%>
    <p>
      You may edit the user's response below or change the question to override whether the question is marked correct.
    </p>
  <%end%>
</div>
<div class="question body">
  <%= @question.question %>
</div>
<div class="answer-choices">
  <%=  params[:user_id] + " " + params[:id]  %>
  <ol type="A">
    <%=form_for(@assignment , :url => user_assignment_path(params[:user_id] , params[:id]) , :html => {:method => "put"},  :user_id => params[:user_id]) do |f|%>
      <%[@question.answerA, @question.answerB ,@question.answerC ,@question.answerD].each do |choice|%>
        <li>
          <%=  f.radio_button(:response, choice)%>
          <%= choice %>
        </li>
      <%end%>    
    </ol>
    <div class="form-buttons">
      <%= submit_tag("Submit Response") %>
    </div>
  <%end%>
</div>

EDIT 2 Railsコンソールで問題なく手順を実行したところなので、何か奇妙なことが起こっているに違いありません。

4

2 に答える 2

0

これがうまくいくことを願っています。

割り当てモデルで、correctフィールドを as として追加しますattr_accessible。初めてresponsenil であるため、メソッドでステートメントを実行していないbefore_saveため、コードは次のようになります

class Assignment  ActiveRecord::Base
  belongs_to :user
  belongs_to :question
  attr_accessible :title, :body, :user_id, :question_id , :response, :correct
  before_save :grade


  def grade
    correct = (response == question.solution) unless response.nil?
  end
end

そしてコントローラーのアクションは

def update
  @assignment = Assignment.find(params[:id])
  @user = @assignment.user
  @assignment.update_attributes(:response => params[:assignment][:response])
  if @assignment.valid?
    flash[:notice] = "Your response has been saved"
    redirect_to(:action => 'show', :id => @assignment.id , :user_id => @user.id)
  else
    render(user_assignment_path(@user, @assignment) , :html => {:method => :get})
  end
end
于 2013-04-02T05:30:41.193 に答える