2012-08-24 6 views
5

パスワードを変更せずに(ユーザーの現在のパスワードを入力する必要がある)ユーザーが設定を変更できるようにする方法を探していました。これを可能にするようだが、有効なモジュールを削除してカスタム検証を設定すると、ちょっとした作業が必要になるようだ。Rails3 + Devise:更新時にパスワードの妥当性を確認しない

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

申し込み、ユーザーが(私は何を期待している)自分のパスワードを指定する必要があります:

私はセットアップ私のユーザモデルで次の検証を持っています。しかし、設定を更新するときにパスワードを空白のままにすると、ユーザーにはパスワードが6文字以上でなければならないというエラーが表示されます。

Deviseの動作方法を変更したり、カスタムコントローラを実装する必要なく、この問題を回避するにはどうすればよいですか?

答えて

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 

それはアップデートに完全に検証をスキップしますので、これは間違っています。ユーザーは設定を更新するときに短い/長い(または空白?)パスワードを設定することができます。

3

Deviseはそれを達成するための独自の方法を持っています、update_without_password、それは現在のパスワードを尋ねることなくレコード属性を更新します。現在のパスワードを変更することはできません。

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

例:

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

これは、すべての工夫のドキュメントです。 http://rdoc.info/gems/devise/index

6

このコードをユーザーモデルに追加してください。

private 
def password_required? 
    new_record? ? super : false 
end 
6

私はアマル・クマールSソリューションを試してみましたが、残念ながらそれは同じ問題を解決するために私を助けていなかったので、ここで実際のプロジェクトでテスト済みのソリューションのバージョンを変更しています。

ここには、devise/models/validatableのコードがあります。ユーザー情報を更新しながら、この条件が常に偽であるので、あなたは、空白のパスワードとパスワードの確認フィールドを離れるとき、RBモジュール

protected 

# Checks whether a password is needed or not. For validations only. 
# Passwords are always required if it's a new record, or if the password 
# or confirmation are being set somewhere. 
def password_required? 
    !persisted? || !password.nil? || !password_confirmation.nil? 
end 

は、検証が失敗します。

!password.nil? || !password_confirmation.nil? 

パスワードとpassword_confirmationフィールドは空白の文字列を「」等しいです決してゼロに等しくはありません。ですから、あなたはpassword_requiredを上書きすることでそれを修正できますか?あなたのユーザモデルのメソッドを変更し、nilを変更しますか?空白にチェックしますか?チェック。

protected 

def password_required? 
!persisted? || !password.blank? || !password_confirmation.blank? 
end 

これを修正するのが最も簡単な方法だと思ってください。それは元のロジックを破壊しません。多分それは夢のバグだ。

+0

これを使用して私のユースケースを処理し、コンソールからユーザーを追加するときのパスワード要件をスキップしました(私はdevise_invitableモジュールを使用しています)。それを達成するために '!persisted?'を 'persisted? 'に変更しなければなりませんでした。 –

関連する問題