活动记录由于某种原因无法保存
Posted
技术标签:
【中文标题】活动记录由于某种原因无法保存【英文标题】:Active record wont save for some reason 【发布时间】:2013-03-23 07:21:17 【问题描述】:我有一个名为 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 结尾 结尾所以当我第一次提交回复时,保存效果很好,它会相应地重定向我。之后,如果我再次尝试编辑问题并重新提交表单,则保存失败。
谁能想到可能发生这种情况的原因?
另外我知道第二次重定向有错误,所以如果有人能纠正我的用法,那将是一个额外的帮助
EDIT 这是Edit erb,以防有人发现这里有问题。我还在上面的控制器中添加了edit方法。
您可以在下方编辑用户的回复或更改问题以覆盖问题是否标记为正确。
user_assignment_path(params[:user_id] , params[:id]) , :html => :method => "put", :user_id => params[:user_id] ) 做 |f|%>
编辑2我刚刚在rails控制台中手动完成了这些步骤,没有任何问题,所以一定有什么奇怪的事情发生了。
【问题讨论】:
请发表您的错误。 我认为从控制器调用grade实例方法而不是添加回调是一个很好的做法,这意味着它只会在保存时调用控制器中的方法,这将当回调堆栈和加载时间增加时,为您省去一些麻烦。 @Jesper 嘿,我没有收到任何错误。这是奇怪的事情。分配只是无法保存并遵循 else 逻辑。我尝试将错误打印到控制台,但没有任何结果。 【参考方案1】:这可能是由于您的grade() 回调方法返回了一个错误,这将一起取消操作(如documentation 中所述)。
【讨论】:
【参考方案2】:希望这对你有用。
在Assignment模型中,将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
【讨论】:
您好,感谢您的回复。不幸的是,这并没有解决问题。作业仍然无法保存。有点莫名其妙的是,它第一次在 response 和 correct 为 nil 时起作用,但在问题被回答后却不起作用以上是关于活动记录由于某种原因无法保存的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft Access 无法在追加查询中追加所有记录