3

私はRailsに慣れていないので、問題に直面しています。私は持っている

モデル

Model1
id: integer
account_id: integer

Account
id: integer

次のようにModel1で検証があります。

モデルコード:

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

View Code のドロップダウンを使用します。

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

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

最初にアカウントを作成してから、フォームから新しいモデルを作成しようとします1。ドロップダウンには、私が持っているすべてのアカウントが表示されます。次に、ドロップダウンから作成したアカウントを選択すると、クライアント側の検証が有効になり、アカウントが存在しないかのように validates_inclusion_of のエラー メッセージである「有効ではありません」と表示されます。何が起こっているのかわからず、データベースを確認したところ、アカウントが作成されました。これが、最初にドロップダウンにアカウントが読み込まれる理由です。

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

それで、新しいアカウントを作成し、新しいアカウント用に新しいモデル1を作成しようとしましたが、検証の失敗が再浮上しました。

キャッシュの問題のようなものですか?クライアント側の検証の問題ですか? 問題が何であるかを見つけようとできる限りのことをしましたが、何が起こっているのかについてのアイデアがありません。

そのため、アカウントを作成するたびに、アプリケーションの動作を強制終了する再デプロイが期待されます。この問題を解決するにはどうすればよいですか? 何が起こっているのかよくわかりません。

Heroku にデプロイされた Config、Rails 3 はアセット パイプラインを使用します

Gems: クライアント側の検証 カミナリ

4

2 に答える 2

2

現在、サーバーが起動するとステートメントが実行されます(正しく認識されているように)。ラムダでラップする必要があるため、検証が完了するたびに実行されます。

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)]}
于 2012-04-14T10:58:20.483 に答える
2

:in => Account.find(:all).collect(&:id)Railsがクラスをロードするときに、本番モードで1回だけ評価されるため、期待どおりに機能していません 。私はそのような検証の背後にある理由を理解していないことを告白します. とにかく、本当にそれを達成したい場合は、カスタムバリデーターを使用する必要があります。

于 2012-04-14T10:58:21.713 に答える