3

私はRailsに慣れていますが、私は問題に直面しています。私が持っているRails 3のvalidates_inclusion_ofが期待どおりに機能しない

モデル

Model1 
id: integer 
account_id: integer 

Account 
id: integer 

次のように私はMODEL1における検証を持って、

モデルのコード:

validates :account_id, :inclusion => { :in => Account.find(:all).collect(&:id)} 

私は ビューコードのドロップダウンを使用します

<%= f.select :account_id, @accounts.collect {|acc| [acc.name, acc.id]}, {:prompt => 'Select Account' }, { :selected => @defaultaccount, :class => 'selectwidth' } %> 

フォームを送信する前に、クライアント側の検証を使用してフィールドの検証を行っています。私はHerokuを使って私のアプリを展開しています。

私は最初にアカウントを作成してから、私は新しいモデルを作成しようとします。ドロップダウンには、私が所有しているすべてのアカウントが入力されます。次に、ドロップダウンから作成したアカウントを選択し、クライアント側の検証が有効になり、「有効ではない」と表示されます。これは、アカウントが存在しないかのようにvalidates_inclusion_ofのエラーメッセージです。 ishappeningが何なのかわかりませんし、データベースをチェックして、アカウントが作成されているので、最初にドロップダウンにアカウントが読み込まれています。

validates_inclusion_ofをrails 3に変更すると、account_id、:inclusion => {:in => {}}の構文が検証され、再デプロイされます。今、私は新しいmodel1フォームでそのアカウントを選択しようとしました。ドロップダウンは以前に作成されたアカウントのエラーを表示しません。

それで、私は新しいアカウントを作成し、新しいアカウントに対して新しいモデル1を作成しようとしましたが、検証の失敗が再現されています。

そのようなキャッシュの問題?それはクライアント側のバリデーションの問題ですか?私は試してみて問題が何であるかを知るためにすべてをやったが、何が起きているのかについてのアイデアはない。

私はアカウントを作成するたびに、再デプロイが実行され、アプリケーションが何をするのかが分かりません。どうすればこの問題を取り除くことができますか?何が起こっているのかは分かりません。

Configを、 Herokuの に配備Railsの3 アセットパイプラインを使用しています

宝石: クライアント側検証 雷

答えて

2

あなたが望むようRailsがロードされたときに:in => Account.find(:all).collect(&:id)は、それが、プロダクションモードで一度だけ評価されていますので、それは働いていませんクラス。私はそのような検証の背後にある理由を理解していないと告白します。とにかく、あなたが本当にそれを達成したい場合は、custom validatorを使用する必要があります。

+0

私は単純化のためだけに検証クエリの全体のロジックを与えていません:)評価についての頭のおかげで、ありがとう。 – Baaju

+0

ああ。検証とスコープによる評価の問題は、時にはあなたを怒らせることのできるものです:) – lucapette

1

サーバが起動されると(あなたが正しく実現される)現在、文が実行されます。ラムダでラップする必要があるので、検証が完了するたびに実行されます。

1.8.7構文:

validates :account_id, :inclusion => { :in => lambda {Account.find(:all).collect(&:id)}} 

1.9.2構文:

validates :account_id, :inclusion => { :in => ->{Account.find(:all).collect(&:id)]} 
+0

はい。私はprocやlambaを使うことができることを忘れていました。 – lucapette

関連する問題