从控制器中进行记录更改

时间:2015-08-17 18:26:42

标签: ruby-on-rails ruby-on-rails-4 model-view-controller controller

这是我认为非常容易的事情,但事实证明并非如此。

我试图在我的FooBarsController的更新操作中找到对某些记录所做的更改(让我们称之为FooBar)。

不幸的是,似乎ActiveRecord :: Persistence中定义的.update方法不会更新记录上的changes属性。

For Instance:

def update
  @resource = FooBar.find(params[:id])
  if @resource.update(resource_params)
    @resource.changes # => {} 
    render json: @resource
  else
    render_validation_errors @resource.errors
  end
end

这是为什么?有谁知道如何获得更改?

注意:我不想使用模型钩子。我试图与更改一起使用的代码将使用current_user方法,因此,使用模型钩子将是各种脏。

2 个答案:

答案 0 :(得分:0)

我认为您正在寻找ActiveModel::Dirty模块。

它有一个changed_attributes方法,它会为您提供未保存更改的属性哈希,指示其原始值

e.g。

person.name # => "bob"
person.name = 'robert'
person.changed_attributes # => {"name" => "bob"}

此外,有一个很棒的宝石paper_trail可以帮助跟踪模型的变化。数据。这也可能对你有用!从它的github页面:

  

跟踪模型的更改,以进行审核或版本控制。看看如何   model查看其生命周期的任何阶段,将其恢复为任何版本,   或者在它被摧毁后恢复它。

答案 1 :(得分:0)

发现它!

因此,有一个名为.previous_changes的奇妙事物可以找到在上一个事务中所做的更改,因此依赖于调用更新方法,而不是避免它。

有了这个,我就能做到:

def update
  @resource = FooBar.find(params[:id])
  if @resource.update(resource_params)
    @resource.previous_changes # => {'some' => 'changes', 'attribute' => 'new value'} 
    render json: @resource
  else
    render_validation_errors @resource.errors
  end
end