Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 由于某些原因,活动记录无法保存_Ruby On Rails - Fatal编程技术网

Ruby on rails 由于某些原因,活动记录无法保存

Ruby on rails 由于某些原因,活动记录无法保存,ruby-on-rails,Ruby On Rails,我有一个叫做赋值的模型,它代表了多项选择测验应用程序中用户和问题之间的丰富连接。当用户回答问题时,响应将记录在分配控制器中的以下更新方法中 def edit @assignment = Assignment.find_by_id(params[:id]) @user = @assignment.user @question = @assignment.question puts "user #{@user} question

我有一个叫做赋值的模型,它代表了多项选择测验应用程序中用户和问题之间的丰富连接。当用户回答问题时,响应将记录在分配控制器中的以下更新方法中

def edit @assignment = Assignment.find_by_id(params[:id]) @user = @assignment.user @question = @assignment.question puts "user #{@user} question #{@question} assignment #{@assignment}" end def update @assignment = Assignment.find(params[:id]) @user = @assignment.user @assignment.update_attributes(:response => params[:assignment][:response]) if @assignment.save flash[:notice] = "Your response has been saved" redirect_to(:action => 'show', :id => @assignment.id , :user_id => @user.id) else puts @assignment.save puts "could not save" render(user_assignment_path(@user, @assignment) , :html => {:method => :get}) end end 定义编辑 @assignment=赋值。通过_id查找_(参数[:id]) @user=@assignment.user @问题=@assignment.question 放置“用户#{@user}问题#{@question}赋值#{@assignment}” 结束 def更新 @assignment=assignment.find(参数[:id]) @user=@assignment.user @assignment.update_属性(:response=>params[:assignment][:response]) 如果@assignment.save flash[:notice]=“您的响应已保存” 重定向到(:action=>'show',:id=>@assignment.id,:user\u id=>@user.id) 其他的 放置@assignment.save 放置“无法保存” 呈现(用户分配路径(@user,@assignment),:html=>{:method=>:get}) 结束 结束 我有一个名为grade的prefore save,它会被调用。模型如下:

class Assignment ActiveRecord::Base belongs_to :user belongs_to :question attr_accessible :title, :body, :user_id, :question_id , :response before_save :grade def grade self.correct = (response == self.question.solution) unless response == nil end end 类分配ActiveRecord::Base 属于:用户 属于:问题 可访问属性:标题、正文、用户id、问题id、回复 保存前:评分 def等级 self.correct=(response==self.question.solution),除非response==nil 结束 结束 因此,当我第一次提交响应时,save可以完美地工作,并相应地重定向我。之后,如果我再次尝试编辑问题并重新提交表单,则保存失败

有人能想出发生这种情况的原因吗

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

编辑此处是编辑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>
您可以在下面编辑用户的回答,或更改问题以覆盖该问题是否标记为正确。

用户分配路径(参数[:用户id],参数[:id]),:html=>{:方法=>“放置”},:用户id=>参数[:用户id])do | f |%>

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

    希望这对您有用

    分配模型中,将
    更正
    字段添加为
    属性可访问
    。第一次,由于
    响应
    为nil,它没有执行
    prefore\u 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
    

    这可能是因为grade()回调方法返回false,这将一起取消操作(如中所述)。

    请发布错误。我认为最好从控制器调用grade实例方法,而不是添加回调来执行此操作,这意味着它在保存时只调用控制器中的方法,这将在回调堆栈和加载时间增加时为您节省一些麻烦。@Jesper嘿,我没有收到任何错误。这是一件奇怪的事情。分配只是无法保存,并遵循else逻辑。我试着在控制台上打印错误,但是没有结果。嘿,谢谢你的回复。不幸的是,这并没有解决问题。分配仍然无法保存。令人费解的是,它在第一次响应和正确性为零时起作用,但在问题得到回答后就不起作用了