6

ユーザーがパスワードを変更せずに設定 (ユーザー モデル) を変更できるようにする方法を探しています (現在のパスワードを入力する必要があります)。Devise はすぐに使用できるようですが、validatable モジュールを削除してカスタム検証をセットアップする場合は、少し回避する必要があるようです。

ユーザーモデルで次の検証をセットアップしました。

validates :password, length: { in: 6..128 }

サインアップするとき、ユーザーは自分のパスワードを指定する必要があります (これは私が期待していることです)。ただし、設定を更新するときにパスワードを空白のままにすると、パスワードは 6 文字以上である必要があるというエラーがユーザーに表示されます。

Devise の動作を変更したり、何らかのカスタム コントローラを実装したりせずに、これを回避するにはどうすればよいですか?

4

4 に答える 4

13

たぶん、これは一部の人にとっては明白に見えるかもしれませんが、これをまとめるのにしばらく時間がかかりました. さまざまなソリューションと回避策を数時間試し、あちこちを調べた後、Rails の検証をさらに深く掘り下げたところ、いくつかの構成要素を見つけました。それらを組み合わせると、これが非常に簡単になります。

私がしなければならなかったのは、作成アクションと更新アクションの検証をセットアップし、更新時に空白を許可することだけでした。

  validates :password, length: { in: 6..128 }, on: :create
  validates :password, length: { in: 6..128 }, on: :update, allow_blank: true

これで、必要な動作が得られました。コードはわずか 2 行です。

追記:

最初に、私はこの方法を試しました:

validates :password, length: { in: 6..128 }, on: :create

これは、更新時に検証を完全にスキップするため、間違っています。ユーザーは、設定を更新するときに短い/長い (または空白の?) パスワードを設定できるようになります。

于 2012-08-24T14:01:55.323 に答える
3

Devise にはそれを実現するための独自の方法がありupdate_without_passwordます。現在のパスワードを要求せずにレコード属性を更新します。現在のパスワードの変更を許可しません。

ノート。このメソッドを使用している場合は、おそらくこのメソッドをオーバーライドして、パスワードなしで更新したくない他の属性を保護する必要があります。

例:

def update_without_password(params={})
  params.delete(:email)
  super(params)
end

それはすべてDeviseのドキュメントにあります。http://rdoc.info/gems/devise/index

于 2013-01-11T17:40:41.990 に答える