2011-09-19 67 views
1

一些驗證,我不知道這問題是由於缺乏知識或在我的設計有問題。跳過在不同的控制器訪問同一型號

從本質上講,我希望我的用戶能夠登錄,並給予一個默認角色。稍後,他們可以成爲「經理」,並需要第二個註冊表單來實現這一點。

然而,標準用戶和管理者之間的差異是很小的來講什麼數據他們有(但在他們被允許哪些權限方面非常不同)。因此,我選擇了兩個用戶模型,然後使用兩個控制器user_controller和managers_controller來提供兩種不同的註冊表單和最終的創建請求。可能這是處理這種情況的錯誤方法。

我在這個模型的一些驗證設置,我希望能夠確保一些驗證被解僱初始註冊表單(當客人成爲用戶,通過users_controller),其餘是在第二個註冊表單(當用戶成爲manager時,通過managers_controller)被解僱。不過,我使用,例如validates_presence_of那麼它會檢查兩種形式的驗證和抱怨,我不是,例如,詢問我的普通用戶的出生日期。

我知道如何跳過檢查,負責具體行動,但如何做到這我針對不同的控制器?

回答

4

驗證在模型上,所以它們在控制器上是獨立的。順便說一句,你似乎在談論基於角色的方法。

您可以在驗證中使用if聲明來實現您的目標。

validates :date_of_birth, :presence => true, :if => :manager? 

def manager? 
    # It actually depends on your design. 
    # You can use any authorization library. 

    self.role == "manager" 
end 

例如,流行的是cancan

+0

哇,我不知道你能做到這一點。精彩!謝謝! –

1

我假設用戶有某種屬性或協會組成,它的角色存儲。 rails中的每個驗證器(如validates_presence_of)都可以有條件地僅在通過if選項提供的Proc/Method返回true時觸發它。在這樣一個Proc中,如果用戶真的想成爲「經理」,你可以檢查。

我最近有一個類似的問題,其中有驗證依賴於狀態的特定模型實例將是不同。有一個看看state_machine(http://github.com/pluginaweek/state_machine)偕其爲此提供支持。也許這更適合你的場景。

+0

有趣的一個做

@user.save(false) 

,我常常想知道狀態機。聽起來像是值得研究的東西。 –

1

如何

validates_presence_of :something, :if=>:manager? 

def manager? 
    self.manager 
end 

或者跳過驗證具體情況,你可以從控制器

+0

跳過所有驗證是一種糟糕的方法。我不建議這樣做。 – Voldy

相關問題