2010-05-28 58 views

回答

2

我想像你可以檢查調用堆棧,但這正是型號是而不是:他們現在應該沒有關於控制器。

檢查堆棧:

if caller.grep /create/ 
    # do something 
elsif caller.grep /update/ 
    #do something else 
end 

應該做的伎倆。

+0

這是一個特例。有時你需要看看它來自何種方法。例如在驗證方法中有:on =>:create symbol – djburdick 2010-05-28 00:47:06

+0

在這種情況下,只需使用'caller'方法返回一個名爲方法名稱的數組。 – 2010-05-28 15:22:37

+0

一方面很高興知道這樣的事情是可能的。但是這對我來說就像@Jakub所說的那樣錯誤:這不是模型的目的。模型可以知道你是在創建一個新的對象還是在更新一個現有的對象。如果有需要的話,我會添加一個參數到我的初始化或其他東西。爲了讓模型儘可能無知和分離(更不用說可測試:你將如何測試這種行爲?)。 – nathanvda 2010-05-28 19:06:28

2

只需將create標誌傳遞給模型方法,或者在模型中創建兩種不同的方法並從控制器調用相應的方法。否則,你會在控制器和模型之間創建一個相當不愉快的依賴關係。如您所述,驗證方法需要一個參數來指定它們何時運行。

1

裏面你的模型,你可以問/知道,如果你正在處理的記錄是一個新的記錄,或不

p = Post.new 
p.new_record? => true 
p = Post.first 
p.new_record? => false 

也許可以幫助你夠了嗎?

否則,在模型中,您可以添加callbacks,例如,僅在保存新記錄之前調用的before_create。爲保持模型精簡,並且應該有很多回調,可以將它們分組在observer之內。

希望這會有所幫助。

相關問題