Ruby on Rails:保存无效的嵌套记录

时间:2011-08-13 18:21:23

标签: ruby-on-rails ruby-on-rails-3 nested-attributes

我有NewsItem的模型has_many :attachments。在新的NewsItem表单中,用户可以使用嵌套表单创建项目的附件。

Attachmenttitlefile(已上传)组成。该模型对这两个字段的存在执行验证。

但是,如果我将新附件的字段留空,并点击提交按钮,我会收到正确的错误消息(“标题不能为空”等等),但附件仍然可以获得尽管如此,还是保存了两个(无效)值。

我能提出的唯一相关代码是我在@news.save的{​​{1}}方法中调用create的部分:

NewsItemController

其他所有内容都应由rails处理(新闻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的参数几乎是我所需要的。不幸的是,你只能默默地“忽略”无效记录。如果两个字段中的任何一个为空,我希望用户收到错误消息。有什么想法吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我终于通过一个非常努力的解决方法解决了这个问题。

我现在执行使用:reject_if拒绝无效附件。但是,由于单独这不会产生所需的错误消息,我必须通过为每个条目构造一个新的附件并检查它是否有效来手动检查附件 - params散列的一部分是否有错误。然后我用相关的错误消息填充父对象的errors-array。

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