我有一个模型User
,它会自动生成Task
。
我想将此任务锁定为编辑或删除。
我需要对控制器进行哪些修改?是否有一个优雅的解决方案,或者我是否需要在每次编辑/销毁时检查是否有问题。
答案 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
,用于您关注的操作。通过返回nil
(return
执行的操作),before_filter
将暂停,操作将不会执行。