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
错误,然后在控制器中捕获该错误。当然