Ruby on rails 3 如何";锁;记录是否被更新或删除?

Ruby on rails 3 如何";锁;记录是否被更新或删除?,ruby-on-rails-3,activerecord,locking,Ruby On Rails 3,Activerecord,Locking,我有一个模型用户,它会自动生成一个任务 我想禁止编辑或删除此任务 我需要对控制器进行什么样的修改?是否有一个优雅的解决方案,或者如果是有问题的任务,我是否需要每次都检查编辑/销毁。据我所知,没有优雅的解决方案,您必须每次都在控制器中检查,但在控制器中定义此方法很简单: def find_task @task = Task.find(params[:id]) if @task.locked? flash[:error] = "This task is locked and cann

我有一个模型
用户
,它会自动生成一个
任务

我想禁止编辑或删除此任务


我需要对控制器进行什么样的修改?是否有一个优雅的解决方案,或者如果是有问题的任务,我是否需要每次都检查编辑/销毁。

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

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\u filter
。通过返回
nil
(这就是
return
所做的),过滤器之前的
将停止,操作将不会执行。

您可以使用验证来很好地完成此操作

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
或者,您可以实现只读?在模型上:

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

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

将检查(或使用“僵尸不更新它”保护)移动到模型并使用验证路径如何?@pst:我在控制器中进行了验证,因为这样可以显示闪存错误并重定向出去。但是,您可以让模型引发自定义
ProtectedRecord
错误,然后在控制器中捕获该错误。当然