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
はなぜですか? 外部キーの存在検証の問題を解決するにはどうすればよいですか? nil
article_id
validates :article_id, :presence => true
ただし、CategoryAssociation
モデル クラスでをコメント アウトすると、期待どおりに機能しますが、外部キーを検証しないのは適切なアプローチではないようです。
モデル クラスでをコメント アウトしてvalidates_associated :category_associations
も、エラーが発生します。Article
{:"category_associations.article_id"=>["can't be blank"]}