跟踪参数更改轨道活动记录

时间:2016-04-13 20:24:27

标签: ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord

所以我有我的表格,在我的控制器中我有我的更新方法如下

def update 
  @student = Student.find(params[:id])

  if @student.update_attributes!(student_params)
    @student.read_notes = true
    #here i check if the records changed or not?
    ap @student.name_changed? 
  end
end

def student_params
  params.require(:student).permit(:name, :email, :age, :class)
end

这失败了,因为我每次都会得到错误的回复,即使我实际上已对名称记录进行了更改。

如果我通过这种方式更新,我如何实际跟踪记录中的更改?

1 个答案:

答案 0 :(得分:0)

当您保存记录时(update_attributes!update!update都会执行此操作),Rails的“脏跟踪”会重置,您无法轻易判断是否有任何内容改变。您可以做的是使用assign_attributes,如下所示:

def update 
  @student = Student.find(params[:id])

  @student.assign_attributes(student_params)

  if @student.name_changed?
    # ...
  end

  @student.save!
end

还有一个名为previous_changes的ActiveRecord方法,用于存储保存后所做的更改。 This article详细介绍了如何使用它。

您还可以简单地跟踪name参数是否与记录的name不同,或者在更新之前存储该值,然后根据您的需要进行比较。