2011-08-25 61 views
4

我有一個模型User它自動產生一個Task如何「鎖定」更新或刪除的記錄?

我想從編輯或刪除中鎖定此任務。

需要對我的控制器進行哪些修改?是否有一個優雅的解決方案,或者我需要檢查每次有編輯/銷燬,如果這是有問題的任務。

回答

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將停止並且該操作不會被執行。

+0

移動支票(或有一個「zomg不更新」守衛)到模型和使用驗證路線? – 2011-08-25 00:24:01

+0

@pst:我在控制器中做了這個,因爲那樣會顯示閃存錯誤並重定向。但是,您可以讓模型引發一個自定義的ProtectedRecord錯誤,然後在控制器中捕獲該錯誤。當然。 –

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 

這種做法將引發異常,而不是驗證錯誤。我想這取決於你想要做什麼,哪種方法更好。

相關問題