2011-08-13 96 views
0

我有一個模型NewsItemhas_many :attachments。在新的NewsItem窗體中,用戶可以使用嵌套窗體創建項目的附件。Ruby on Rails:無效的嵌套記錄得到保存

一個Attachment由一個title和一個file(它被上傳)組成。該模型對這兩個域的存在進行驗證。但是,如果我將新附件的字段保留爲空,並點擊提交按鈕,我會得到正確的錯誤消息(「標題不能爲空」等等),但附件仍然保持不變儘管如此,仍然可以用兩個(無效)值保存。

唯一相關的代碼,我可以想出是我在NewsItemControllercreate方法調用@news.save部分:

respond_to do |format| 
    if @news.save 
    flash[:success] = t('news.flash.created') 
    format.html { redirect_to news_index_path } 
    else 
    format.html { render :action => "new" } 
    end 
end 

一切應以軌道(新聞accepts_nested_attributes_for :attachments, :allow_destroy => true)進行處理。

任何想法,我在做什麼錯在這裏?

更新:

這似乎是:reject_if -parameter的accepts_nested_attributes_for幾乎是我所需要的。不幸的是,你只能默默地「忽略」無效記錄。如果兩個字段中的任何一個都爲空,我希望用戶收到錯誤消息。有任何想法嗎?

回答

0

嘗試使用:inverse_of

class NewsItem < ActiveRecord::Base 
    has_many :attachments, :inverse_of => :news_item 
end 

class Attachment < ActiveRecord::Base 
    belongs_to :news_item, :inverse_of => :attachments 
end 
+0

問題是,我簡單地回答了這個問題:整個事情是一個多態關係,並通過一個可連接接口:'Attachment belongs_to:attachable,:polymorphic => true'和'news_item has_many:attachments: as =>:可附加的,:dependent =>:destroy' – DeX3

+0

剛發現rails文檔中說:inverse_of不適用於多態關聯,還有其他想法? – DeX3

+0

對不起,我沒有。順便說一句,你應該使用'polymorphic'來更新你的問題。 –

0

我終於做一個相當困難的解決辦法解決它。

我現在用用法:reject_if拒絕無效附件。但是,由於這本身不會產生所需的錯誤消息,因此我必須通過爲每個條目構造一個新的附件並檢查它是否有效來手動檢查params散列的附件 - 部分錯誤。然後用相關的錯誤消息填充父對象的errors-array。

我知道一個相當不方便的解決方案,但至少它是有效的。