我正在使用 Ruby on Rails v3.2.2。我想解决与使用accepts_nested_attributes_for
和validates_associated
RoR 方法时外键验证相关的问题。也就是说,我有以下模型类:
class Article < ActiveRecord::Base
has_many :category_associations, :foreign_key => 'category_id'
accepts_nested_attributes_for :category_associations, :reject_if => lambda { |attributes| attributes[:category_id].blank? }
validates_associated :category_associations
end
class CategoryAssociation < ActiveRecord::Base
belongs_to :article, :foreign_key => 'article_id'
belongs_to :category, :foreign_key => 'category_id'
validates :article_id, :presence => true
validates :category_id, :presence => true
end
...我有以下控制器操作:
class ArticlesController < ApplicationController
def new
@article = Article.new
5.times { @article.category_associations.build }
# ...
end
def create
@article = Article.new(params[:article])
if @article.save
# ...
else
# ...
end
end
end
使用上面的代码(受嵌套模型表单第 1 部分Rails Cast 的“启发”) ,我的意图是在创建文章时存储类别关联(注意:类别对象已经存在于数据库中;在我的情况下,我只想存储-创建类别关联)。但是,当我从相关视图文件提交相关表单时,我收到以下错误(我正在记录错误消息):
{:"category_associations.article_id"=>["can't be blank"], :category_associations=>["is invalid"]}
为什么它会发生,因为它validates_associated
似乎运行了该方法article.category_association.valid?
,但只有在article.category_association.article_id
is not nil
的情况下?如何解决article_id
外键存在验证的问题?
validates :article_id, :presence => true
但是,如果我在模型类中注释掉CategoryAssociation
,它会按预期工作,但它似乎不是不验证外键的正确方法。
validates_associated :category_associations
如果我在模型类中注释掉Article
,我仍然会收到错误:
{:"category_associations.article_id"=>["can't be blank"]}