2010-01-26 84 views
3

我正在開發一個複雜的表單,一次更新一個模型的幾個記錄,同時更新相關的模型。它看起來有點像這樣:Rails複雜的表單一次編輯多條記錄與協會

class Sport 
    has_one :photo 
end 

class Photo 
    belongs_to :sport 
    acts_as_fleximage 
end 

class Page 
    # the page is not related to either of the previous models 
end 

只是爲了一點背景資料,頁面模型是一個通用模型,該用戶將能夠創建多達他們喜歡(一個CMS)。此外,他們在註冊時會獲得少量強制性「系統」頁面。當他們嘗試編輯系統頁面時,表單與通用頁面表單略有不同。

其中一個系統頁面是「體育」頁面。他們可以在每個運動項目中添加一些文字(保存在「運動」模型中)並上傳照片(保存在「照片」模型中)。

我製作了一個表格,似乎在做這個伎倆。我不會發布的觀點,但這裏是它發出的參數的例子:

:id => 1 
:page => {"title"=>"Our sports"} 
:sport => { 
    "1" => { 
    "description" => "<p>I love playing hockey...</p>" 
    "photo_attributes" => { 
     "image_file" => #<File:/tmp/RackMultipart20100126-955-k0gxu8-0>, 
     "description" => "Me in my hockey kit" 
    } 
    }, 
    "2" => { #more of the same} 
} 

現在,爲了保存這一切,我的控制器/動作看起來是這樣的:

def update_sports_page 
    @page = Page.find params[:id] 
    @page.update_attributes params[:page] 
    Sport.update(params[:sport].keys, params[:sport].values) 
    redirect_to #etc 
end 

現在當我編輯體育頁面時,除了更新照片之外,所有內容都可以正確保存和更新,除了更新數據庫中的現有記錄外,它僅創建一條新記錄並將舊記錄的sport_id設置爲NULL

因此,最終,經過多次編輯,數據庫中存在大量的孤立記錄。

任何人都可以發現我在這裏做錯了嗎?

(PS,如果它是相關的,我使用fleximage在照片模式)

+0

您是否嘗試過暫時將'image_file'字段更改爲URL?我懷疑這個問題是與數據庫中的數據空間有關,也可能是與它們有關的一些錯誤。 – 2010-01-26 17:39:53

回答

1

這可能是正確的行爲,因爲該關聯設置:依賴=>:在默認情況下,不會令:依賴= >:毀滅。

可能可以與修復:

class Photo 
    belongs_to :sport, 
    :dependent => :destroy 
end 

應自動刪除孤立記錄爲您服務。

在執行任何查找或更新操作時,您還應該小心捕獲異常。

def update_sports_page 
    @page = Page.find params[:id] 
    @page.update_attributes params[:page] 

    params[:sport].each do |sport_id, sport_params| 
    sport = Sport.find(sport_id) 
    sport.update_attributes!(sport_params) 
    end 

    redirect_to #etc 
rescue ActiveRecord::RecordNotFound 
    render(:partial => 'page_not_found', :status => :not_found) 
rescue ActiveRecord::RecordInvalid 
    render(:action => 'edit') 
end 

這是一個例子。編輯和更新方法應該有一個通用的「運動加載器」機制,可以處理檢索頁面的所有相關記錄,而不必在更新期間複製此功能。它負責在更新時捕獲錯誤並將其顯示在編輯頁面上供審閱。