1

validates_existence_of ジェムを使用しています。外部キーをnilにしたい場合を除いて、うまく機能します。

ユーザーとプロジェクトのモデルは次のとおりです。プロジェクトはユーザーと貢献者 (貢献者はユーザーでもあります) に属していますが、貢献者は nil である可能性があります。

ここに私のユーザーモデルがあります:

class User < ActiveRecord::Base
  attr_accessible :first_name, :last_name
  has_many :projects, :dependent => :destroy
  has_many :user_trimester_statuses, :dependent => :destroy
end

そして、ここに私のプロジェクトモデルがあります:

class Project < ActiveRecord::Base
  attr_accessible :added, :amount, :contributor_id, :label, :ref, :trimester_id,    :user_id
  belongs_to :user
  belongs_to :contributor, :class_name => 'User'
  belongs_to :trimester
  validates :user, :existence => { :both => false }
  validates :trimester, :existence => { :both => false }
  validates :contributor, :existence => { :allow_nil => true, :both => false }
end

新しいプロジェクトを追加しようとすると、user_id または triester_id フィールドが空白または無効である場合にエラーが発生します。ただし、contributor_id フィールドについては、フィールドが無効な場合でもエラーはスローされません。いずれかの方法 (有効、無効、または nil) を通過します。

私は何を間違っていますか?ruby 2.0.0p0 と rails 3.2.13 を使用しています。

4

1 に答える 1

2

プロジェクトでこれに関する未解決のバグがあるようです。

https://github.com/perfectline/validates_existence/issues/15

これが修正されるまで、このケース用の簡単なカスタム バリデータを作成する必要があるかもしれません。(または、掘り下げて、自分で問題を解決できるかどうかを確認してください)

更新: プロジェクトのクローンを作成し、問題が何であるかを確認するためのテストを作成しました。allow_nil を追加すると、存在バリデーターがまったく呼び出されないようです。理由はわかりませんが、当面は、proc を使用することで簡単にバグを回避できます。それ以外の

validates :contributor, :existence => { :allow_nil => true, :both => false }

これは仕事を成し遂げるでしょう

validates_existence_of :contributor, :unless => Proc.new { |obj| obj.contributor_id.blank? }

テストケースでそれを証明できました。(この場合はよりクリーンだと思ったので、「validates」の代わりに「validates_existence_of」メソッドを使用しました)

于 2013-04-08T18:25:55.420 に答える