我有一個模型User
它自動產生一個Task
。如何「鎖定」更新或刪除的記錄?
我想從編輯或刪除中鎖定此任務。
需要對我的控制器進行哪些修改?是否有一個優雅的解決方案,或者我需要檢查每次有編輯/銷燬,如果這是有問題的任務。
我有一個模型User
它自動產生一個Task
。如何「鎖定」更新或刪除的記錄?
我想從編輯或刪除中鎖定此任務。
需要對我的控制器進行哪些修改?是否有一個優雅的解決方案,或者我需要檢查每次有編輯/銷燬,如果這是有問題的任務。
有,據我所知,你就必須檢查在控制器每次沒有完美的解決方案,但是這是簡單的通過在控制器中定義該方法:
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
將停止並且該操作不會被執行。
您可以使用驗證來很好地完成此操作。
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
這種做法將引發異常,而不是驗證錯誤。我想這取決於你想要做什麼,哪種方法更好。
移動支票(或有一個「zomg不更新」守衛)到模型和使用驗證路線? – 2011-08-25 00:24:01
@pst:我在控制器中做了這個,因爲那樣會顯示閃存錯誤並重定向。但是,您可以讓模型引發一個自定義的ProtectedRecord錯誤,然後在控制器中捕獲該錯誤。當然。 –