2011-08-13 22 views
0

has_many :attachmentsというモデルNewsItemがあります。新しいNewsItemフォームでは、ユーザーはネストされたフォームを使用してアイテムの添付ファイルを作成できます。Ruby on Rails:無効なネストされたレコードが保存されます

Attachmentは、titlefile(アップロードされています)から成ります。モデルは、これらのフィールドの両方の存在について検証を実行します。

ただし、新しい添付ファイルのフィールドを空白にして[送信]ボタンを押すと、正しいエラーメッセージ(「タイトルは空白にしないでください」など)が表示されますが、それにもかかわらず両方の(無効な)値で保存されます。

のみ関連するコード、私が思い付くことができ、私は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)によって処理されなければなりません。

私がここで間違っていることに関するアイデアはありますか?

更新:

accepts_nested_attributes_for:reject_if -parameterは私が必要なものはかなりあるように思えます。残念ながら、無効なレコードを暗黙的に "無視"することしかできません。私は、2つのフィールドのいずれかが空白の場合、エラーメッセージを受け取るようにします。何か案は?

答えて

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

問題は、私はこの問題を単純に答えました。この全体が多相関係であり、Attachableインターフェイスを経由しています:「Attachment belongs_to:attachable、:polymorphic => true」と「news_item has_many:attachments、 =>:attachable、:dependent =>:destroy' – DeX3

+0

rails docsが言っていることは、inverse_ofは多態的な関連付け、他のアイデアでは機能しないとわかりましたか? – DeX3

+0

申し訳ありませんが、私はしていません。ところで、あなたは 'polymorphic'を使っている情報で質問を更新するべきです。 –

0

私は最終的にはかなりハードな回避策を実行して、それを解決しました。

今すぐするを使用してください。無効な添付ファイルを拒否するには、reject_ifを使用します。ただし、これだけでは目的のエラーメッセージが生成されないため、添付ファイルを手動でチェックする必要があります。つまり、各エントリの新しい添付ファイルを作成し、有効かどうかを確認することです。次に、親オブジェクトのerrors配列に、関連するエラーメッセージを埋めます。

私が知っているむしろ不便な解決策です...しかし、少なくともそれは動作します。

関連する問題