web-dev-qa-db-ja.com

パスワード/パスワードの確認を検証しないデバイス

コードに基づいてユーザーパスワードの編集を処理するカスタムコントローラーがあります 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 にあります。

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

33
Kyle Decot

Deviseで検証を行う場合は、:validatableモジュールをモデルに追加する必要があります。これはかなり簡単です。devise呼び出しのモジュールのリストに:validatableを追加するだけで、モデルは次のようになります。

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

これにより、deviseに検証が追加されます。

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

validates_confirmation_of :password

これがお役に立てば幸いです。

68
sarahhodne

Rails 4のapplication_controller.rbで強力なパラメータを初期化するのを忘れたと思います

before_action:configure_permitted_pa​​rameters、次の場合::devise_controller?保護された

 def configure_permitted_parameters    
    devise_parameter_sanitizer.for(:sign_up){|u|u.permit(:email,:password,:password_confirmation)}
 end  
6
Jigar Bhatt

コントローラで更新するオブジェクトを見つけます。

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

古いパスワードを更新したくない場合は、更新の前にこれらの行を追加して、新しいコードが次のようになるようにします。

    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

このようなものをuser.rbモデルに書く

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