コードに基づいてユーザーパスワードの編集を処理するカスタムコントローラーがあります 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 にあります。
問題は、パスワード編集フォームに何を入力しても(またはそのために入力しなくても)、「成功」フラッシュメソッドが表示されることです。
Deviseで検証を行う場合は、:validatable
モジュールをモデルに追加する必要があります。これはかなり簡単です。devise
呼び出しのモジュールのリストに:validatable
を追加するだけで、モデルは次のようになります。
devise
:database_authenticatable,
:lockable,
:registerable,
:recoverable,
:rememberable,
:trackable,
:validatable
これにより、deviseに検証が追加されます。
別の簡単な方法は、独自の検証を追加することです。パスワードの確認が一致することを検証したいだけの場合は、モデルにこれを追加してvalidates_confirmation_of
検証を追加できます。
validates_confirmation_of :password
これがお役に立てば幸いです。
Rails 4のapplication_controller.rbで強力なパラメータを初期化するのを忘れたと思います
before_action:configure_permitted_parameters、次の場合::devise_controller?保護された
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up){|u|u.permit(:email,:password,:password_confirmation)}
end
コントローラで更新するオブジェクトを見つけます。
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