2011-08-13 60 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。

我知道一个相当不方便的解决方案,但至少它是有效的。