0

我有一个名为 assignment 的模型,它表示用户和多项选择测验应用程序中的问题之间的丰富连接。当用户回答问题时,响应会记录在 assignments 控制器中的以下更新方法中

    定义编辑
        @assignment = Assignment.find_by_id(params[:id])
        @user = @assignment.user
        @question = @assignment.question
        提出“用户#{@user}问题#{@question}作业#{@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)
        别的
          放@assignment.save
          提出“无法保存”
          渲染(user_assignment_path(@user, @assignment) , :html => {:method => :get})
        结尾
      结尾

我有一个在保存之前调用的等级,它会被调用。这是模型:

 

    类分配 ActiveRecord::Base
      属于_to:用户
      属于_to:问题
      attr_accessible :title, :body, :user_id, :question_id , :response
      before_save :等级


      默认等级
        self.correct = (response == self.question.solution) 除非 response == nil
      结尾
    结尾

因此,当我第一次提交响应时,保存工作完美,并相应地重定向了我。之后,如果我尝试再次编辑问题并重新提交表单,则保存失败。

谁能想到可能发生这种情况的原因?

另外我知道第二次重定向有错误,所以如果有人能纠正我的用法,那将是一个额外的帮助

编辑这里是编辑erb,以防有人在这里发现错误。我还在上面的控制器中添加了编辑方法。

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

编辑 2 我刚刚在 rails 控制台中手动完成了这些步骤,没有任何问题,所以一定有一些奇怪的事情发生了。

4

2 回答 2

1

这可能是由于您的grade() 回调方法返回一个错误,这将一起取消操作(如文档中所述)。

于 2014-03-05T08:34:34.597 回答
0

希望这对你有用。

分配模型中,将correct字段添加为attr_accessible。第一次response是 nil,它没有执行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 回答