1

質問は非常に単純です。いくつかの属性を更新したくない場合でも、 update_attributes はモデルの可能なすべての検証を検証しますか?

ユーザーが自分のパスワードを変更できる編集ビューがありますが、それを渡した場合に限ります。つまり、空白の場合、パスワードは変更されません。

したがって、コントローラーで次のことを行います。

def update
    params[resource_name].delete(:password) if params[resource_name][:password].blank?
    params[resource_name].delete(:password_confirmation) if params[resource_name][:password_confirmation].blank?
    params[resource_name].delete(:current_password) if params[resource_name][:current_password].blank?
    if resource.update_attributes(params[resource_name])
        ...
    end
end

モデルに次の検証を定義しました。

validates :password,
          :length => { :within => 6..40 }

そのため、call the update を使用するたびに、パスワードが短すぎるというエラーが表示されます

Ps .: 私はこれを処理するために Devise を使用しています。

編集: Devise がすでにパスワードの検証を行っているかどうか知っている人はいますか? 原因は、検証を削除したところ、正しい方法で機能しましたが、短いパスワードを入力しても、短すぎるという検証が表示されます。

4

1 に答える 1

6

はい、モデルのdeviseメソッドに :validatable を渡した場合、Deviseはパスワードの検証を提供します。パスワードの長さのデフォルト設定は 6..128 です。これは config/initializers/devise.rb で上書きできます (101 行目あたり)。

モデルから :validatable を削除し、必要に応じて独自の検証を作成できます。これを行い、パスワードが update_attributes に渡されない場合に検証を実行したくない場合は、次のようにします。

validates :password, :presence => true, :if => lambda { new_record? || !password.nil? }
于 2011-08-19T17:32:38.550 に答える