2011-07-01 16 views
29

私は、hereコードに基づいてユーザーパスワードの編集を処理するカスタムコントローラを持っています。パスワード/パスワードの妥当性チェックの妥当性チェック

ユーザーモデル

attr_accessible :password, :password_confirmation, :username, :login 
... 
devise :database_authenticatable, 
     :lockable, 
     :registerable, 
     :recoverable, 
     :rememberable, 
     :trackable 

PasswordsController

expose(:user) { current_user } 

def update 
    if user.update_with_password(params[:user]) 
    sign_in(user, :bypass => true) 
    flash[:notice] = "success" 
    else 
    render :edit 
    end 
end 

私の編集パスワードフォームがhereに位置しています。

問題は、編集パスワードフォームに何を入力しても(または入力しなくても)、「成功」フラッシュメソッドが表示されることです。

+0

どのように動作しますか?確認フィールドが一致しないか、current_passwordが間違っていると、パスワードは変更されません。 – Dex

+0

これは、password_confirmationに何があるかにかかわらず、:passwordにあるものに変わります。 –

+0

if文を 'params [:user] [:password] == params [:user] [:password_confirmation]'に変更し、bodyに 'user.update_with_password(params [:user])'を入れるとどうなりますか? ? –

答えて

62

Deviseにバリデーションを実行させる場合は、:validatableモジュールをモデルに追加する必要があります。これを行うのは非常に簡単です、ちょうどdeviseコール内のモジュールのリストに:validatableを追加するので、あなたのモデルは言う:

devise 
    :database_authenticatable, 
    :lockable, 
    :registerable, 
    :recoverable, 
    :rememberable, 
    :trackable, 
    :validatable 

これは工夫がバリデーションを追加いたします。

もう1つの簡単な方法は、独自の検証を追加することです。あなただけのパスワードの確認が一致することを確認したい場合は、お使いのモデルにこれを追加することでvalidates_confirmation_of検証を追加することができます。

validates_confirmation_of :password 

私はこのことができます願っています。

+1

'validates_confirmation_of:password'は私が紛失していたものです –

1

あなたのオブジェクトをコントローラで見つける。

user = User.find_by_id(params[:id]) 
    unless user.blank? 
     if user.update_attributes(params[:user]) 
     flash[:notice] = "User updated successfully." 
     redirect_to "somwhere" 
     else 
     render :action => 'edit' 
     end 
    else 
     render :action => 'edit' 
    end 

あなたは新しいコードがされるようupdation前にこれらの行を追加し、古いパスワードを更新しない場合:user.rbモデルでは、このような

user = User.find_by_id(params[:id]) 
     unless user.blank? 
      params[:user].delete(:password) if params[:user][:password].blank? 
      params[:user].delete(:password_confirmation) if params[:user][:password_confirmation].blank? 
if user.update_attributes(params[:user]) 
      flash[:notice] = "User updated successfully." 
      redirect_to "somwhere" 
      else 
      render :action => 'edit' 
      end 
     else 
      render :action => 'edit' 
     end 

書き込み気にいら

devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :locakable 
4

私はあなたがレール4

before_actionにapplication_controller.rbに強いパラメータを初期化するために忘れてしまったと思う:場合、configure_permitted_pa​​rameters::devise_controller? 保護

def configure_permitted_parameters  
    devise_parameter_sanitizer.for(:sign_up){|u|u.permit(:email,:password,:password_confirmation)} 
end 
+1

それは私には何ですか、私は' password_confirmation'を墨塗りされたパラメータのリストに追加するのを忘れました、ありがとう! – hernandes

関連する問題