2010-11-02 65 views
0

我期待着看看是否有一個聰明的方式來做類似以下的事情...Rails - 費率限制模型的創建

在我的應用程序中我有項目。我想阻止用戶添加10個以上的項目。我在使用rails幾周後才明白,我應該在我的模型中幫助這個,這聽起來是對的嗎?

也應該在模型/幫手級別執行此操作,還是應該使用某種類型的設置文件對所有模型執行此操作?

所以這個想法是,當用戶去創建一個新項目,before_create,它會檢查,如果用戶已經有10多個項目,說,抱歉不是在這個時候?此外,對如何輸出錯誤消息感興趣,但一次爲新手一步。

謝謝

+1

如果沒有內置的驗證器,您可以自定義一個驗證器。 – alternative 2010-11-03 00:06:24

+0

很有意思啊。在模型中?你如何用驗證器發回錯誤信息?你能舉一個簡單的例子來啓動我嗎? – TheExit 2010-11-03 00:09:17

回答

3

這樣做的驗證方法是非常簡單的。在Rails 3,你只需要聲明的驗證過程中運行的方法,它有一個機會,如果情況需要添加錯誤:

class Project 
    validate :user_can_create_projects 

protected 
    def user_can_create_projects 
    if (user and user.projects.count >= 10) 
     errors.add_to_base("You have created too many projects.") 
    end 
    end 
end 

這並不是一個完全防彈方法,有一個很小的機會,有人可能能夠在檢查計數和實際創建項目的時間間隔之間創建項目。例如,當某人雙擊表單提交按鈕時,發生這種事情的可能性就大得多,但實際上這種情況相對較少。

+0

非常酷,如此簡單和優雅。我喜歡它。但是,我正在使用Devise進行身份驗證。並且current_user在模型中不可用,那麼用戶如何獲取用戶? – TheExit 2010-11-03 00:19:34

+1

您需要一個您可以關注的關聯,或者您只需爲此創建一個'attr_accessor:user'即可。在你的控制器中,你會相應地分配它。如果您在該上下文中有更多信息,您也可以在控制器中執行此類驗證。 'user.can_create_more_projects?'方法可能會更好。 – tadman 2010-11-03 00:35:46

+0

attr_accessor:user做什麼,通過Google沒有太多。對於Controller的想法,當我做「Current_User.can_create_more_projects?」時在控制器中,是使用Controller中的can_create_more_projects def還是仍然存在於模型中,只是由控制器訪問?謝謝! – TheExit 2010-11-03 00:57:07