如何“锁定”记录不被更新或删除?

时间:2011-08-25 00:02:51

标签: ruby-on-rails-3 activerecord locking

我有一个模型User,它会自动生成Task

我想将此任务锁定为编辑或删除。

我需要对控制器进行哪些修改?是否有一个优雅的解决方案,或者我是否需要在每次编辑/销毁时检查是否有问题。

2 个答案:

答案 0 :(得分:4)

你可以使用验证来做到这一点。

class Thing < ActiveRecord::Base
  validate :locked_cannot_be_modified

  private

  def locked_cannot_be_modified
    errors.add(:base, "Entry is locked") if changes.any? && whatever_logic_makes_it_locked
  end
end

或者,您可以实现只读吗?在模型上:

class Thing < ActiveRecord::Base
  def readonly?
    whatever_logic_makes_it_locked || super
  end
end

此方法将引发异常而不是验证错误。我想这取决于你正在尝试做哪种方法更好。

答案 1 :(得分:2)

据我所知,没有优雅的解决方案,您必须每次都在控制器中进行检查,但通过在控制器中定义此方法,这很简单:

def find_task
  @task = Task.find(params[:id])
  if @task.locked?
    flash[:error] = "This task is locked and cannot be altered at this stage."
    redirect_to tasks_path and return
  end
end

然后,您可以将此方法称为before_filter,用于您关注的操作。通过返回nilreturn执行的操作),before_filter将暂停,操作将不会执行。