30

Ruby on Rails v3.2.2 を使用しています。accepts_nested_attributes_forおよびvalidates_associatedRoR メソッドを使用する場合の外部キーの検証に関連する問題を解決したいと考えています。つまり、次のモデル クラスがあります。

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はなぜですか? 外部キーの存在検証の問題を解決するにはどうすればよいですか? nilarticle_id

validates :article_id, :presence => trueただし、CategoryAssociationモデル クラスでをコメント アウトすると、期待どおりに機能しますが、外部キーを検証しないのは適切なアプローチではないようです。


モデル クラスでをコメント アウトしてvalidates_associated :category_associationsも、エラーが発生します。Article

{:"category_associations.article_id"=>["can't be blank"]}
4

4 に答える 4

0

この種のエラーでも立ち往生している場合は、次のものを置き換えてみてください。

validates :article_id, :presence => true
validates :category_id, :presence => true

と:

validates :article, :presence => true
validates :category, :presence => true

私のために働いた。

于 2021-04-05T20:19:32.300 に答える
-2

検証はcreateor (ご想像のとおり) で実行されるため、「それらのそれぞれで、保存saveされたインスタンスが参照されているか?」と自問してください。保存がなければ、インスタンスはデータベースであるため ID を持たないためです。 IDを割り当てます。


編集:コメントで言ったように、反対票を投じる場合は、その理由についてコメントを残してください。

于 2012-11-12T14:32:57.610 に答える