你如何编写一个只保存更改项目的Rails表单?

时间:2011-12-07 18:36:11

标签: ruby-on-rails forms crud

我有一个表单,用户可以在其上同时编辑多个对象。该表单使用form_tagtext_field_tagselect_tagcheck_box_tag的许多实例(通过迭代)。

按照目前的构成,提交表单会导致控制器操作在可能已更新的每个对象上调用.save!,无论用户是否对其进行了任何更改。这显然不太理想。

如何更改表单和控制器操作,以便它们只保存需要保存的对象?

1 个答案:

答案 0 :(得分:1)

我会通过在每个相应的模型上设置before_save过滤器来完成此操作。加载当前对象的已保存状态,并比较相关属性。如果没有更改任何属性,则返回false:

class Post < ActiveRecord::Base
  before_save :check_for_changes

private
  def check_for_changes
    saved = Post.find(self.id)
    should_save = false
    if saved.body != self.body || saved.title != self.title
      should_save = true
    end
    should_save
  end
end

那就是说,我认为编辑宝石是一个好主意。可能还有另一个宝石可以做到这一点。我个人并不知道。