1

私の User モデルには、次の検証があります。

  validates :password, :presence => true, :length => { minimum: 8 }, :on => :update_settings

バリデーターを使用しないと、:on全体的に機能します。ただし、 :on を使用すると、指定されたアクションを実行するときに検証が行われません。

フォームは次のようになります。action="/users/1/update_settings"

ルートは次のように設定されています。user_update_settings PUT /users/:user_id/update_settings(.:format) users#update_settings

こちらのガイドを確認しました。同じ検証が :create などの標準アクションでは機能しますが、自分のアクションでは機能しません。

この検証を有効にするために他に何が欠けているか分かりますか? ありがとう!

4

1 に答える 1

2

私はあなたが:onオプションが何のためにあるかについて混乱していると思います。コントローラでのアクションを指定するためのものではなく、レコードでのアクションを指定するためのものです。ここで行おうとしている方法でコントローラーアクションをモデル検証に結び付けることは、MVCの原則に完全に反します。

ドキュメントを確認してください:

:onオプションを使用すると、検証をいつ実行するかを指定できます。すべての組み込み検証ヘルパーのデフォルトの動作は、保存時に実行されます(新しいレコードを作成するときと更新するときの両方)。変更する場合は、:on =>:createを使用して、新しいレコードが作成されたときにのみ検証を実行するか、:on =>:updateを使用して、レコードが更新されたときにのみ検証を実行できます。

したがって、このオプションは、(デフォルト)、またはのon3つの可能な値のいずれかを取ります。:save:update:create

アクションの名前()が与えられた場合、そのアクションではモデルで呼び出している(または)update_settingsと想定します。この場合、バリデーターで使用する必要があります。これは、条件が特定のコントローラーアクションに固有ではないため、レコードを更新する他のコントローラーアクションにも検証が適用されることを意味することに注意してください。update_attributesupdate_attribute:on => :update

于 2012-11-18T14:32:53.107 に答える