2012-12-30 19 views
0

我有一個模型,人,需要一個時間表,如果它的類型是「計劃」。在它的控制器(從InheritedResources::Base繼承):如何有條件地驗證1-1模型關係?

def create 
    super do 
    @person.schedule = Schedule.create params[:schedule] if @person.scheduled? 
    end 
end 

的事情是,我想驗證「定式」的所有的人都有一個時間表。例如:

validates :schedule, :presence => true, :if => :scheduled? 

在Person模型中。但是因爲時間表belongs_to一個人,它需要創建人之前創建自己(因此該人將有一個ID)。因此,在我的控制器中,人員驗證失敗,因爲日程安排需要稍後創建。

在我不知道的Rails中是否有某些東西可以讓我執行這些驗證?如果我使用accepts_nested_attributes_for,那麼這些驗證是否會通過?

回答

0

也許只是不事先創建它?

@person.schedule = Schedule.new params[:schedule] if @person.scheduled? 

所以@person和分配附表同時(事務)保存

我認爲這是唯一正確的方法。


修訂(由於超:創建概念):

超級行動

def create(&block) 
    ... 
    yield @person if block_given? 
    @person.save # line where @person get saved 
end 

繼承行動

def create 
    super do |person| 
    person.schedule = Schedule.new params[:schedule] if person.scheduled? 
    end 
end 
+0

Person對象獲取調用'創建超級「,所以當這個時候沒有時間表的時候,驗證會在那個時候失敗國家統計局。但是,如果我在創建密鑰之前構建計劃對象,則計劃將沒有正確的人員引用(因爲此人尚未創建,它沒有ID)。 –

+0

如果在超級調用中創建person對象,則最好更改動作邏輯。 「Sheduled?」檢查必須在人員被保存之前進行。您可以向我們展示此操作的完整代碼和超級操作,以使其更清晰。 –