4

ユーザーがパスワードを変更できるようにするフォームを作成しようとしています:

意見:

- form_tag change_password_users_path do

  = error_messages_for :user, :header_message => "Please Try Again", :message => "We had some problems updating your account" 
  %br

  = label_tag :password, "New password:"
  = password_field_tag "password"
  %br

  = label_tag :password_confirmation, "NConfirm new password:"
  = password_field_tag "password_confirmation"
  %br

  = submit_tag "Update Account"

コントローラ:

def change_password
  @user = current_user
  if request.post?
    @user.password = params[:password]
    @user.password_confirmation = params[:password_confirmation]
    if @user.save
      redirect_to user_path(current_user)
    else
      render :action => "change_password"
    end        
  end
end

Authlogic は、パスワードが「短すぎる」か、パスワードが確認と一致しない場合に検証エラーをキャッチしますが、両方のフィールドが空白のフォームが送信された場合は何もしません。「user_path(current_user)」にリダイレクトされるため、@user.save は true を返す必要があります。

データベース内のパスワードは実際には変更されません。

ご協力いただきありがとうございます。

4

4 に答える 4

3

params [:user] [:current_password]も指定する必要があると思います。指定しないと、@userを保存できません。また、テストしたところ、パスワードを変更するとcurrent_userが失われることがわかったため、usersessionを更新する必要があります。

'current_password'アクセサーをユーザーモデルに追加します

class User < ActiveRecord::Base   
  act_as_authentic   
  attr_accessor :current_password 
end

ユーザーコントローラー内

def change_password
  @user = current_user
  if @user.valid_password? params[:user][:current_password]
    @user.password = params[:user][:password]
    @user.password_confirmation = params[:user][:password_confirmation]
    if @user.changed? && @user.save
      UserSession.create(:login => @user.login, :password => params[:user][:password])
      redirect_to user_path(current_user)
    else
      render :action => "change_password"
    end
  end
end
于 2010-11-02T07:41:08.390 に答える
1

どうやらこれは意図された動作です。

http://www.ruby-forum.com/topic/198836

少なくとも私は今知っている...

ありがとう。

于 2009-11-18T06:38:50.127 に答える
1

@user.changedに電話することをお勧めします。次の例のように、空白のパスワードを確認します。

def change_password
  @user = current_user
  if request.post?
    @user.password = params[:user][:password]
    @user.password_confirmation = params[:user][:password_confirmation]
    if @user.changed? && @user.save
      redirect_to user_path(current_user)
    else
      render :action => "change_password"
    end
  end
end
于 2009-11-30T23:11:38.093 に答える
0

それを行う別の方法は、ActiveModel 検証コンテキストを利用することです。User モデルにコンテキスト依存の検証を追加する必要があります。

validates :password, # :password_confirmation,
          :presence => {:message => 'Please enter your new password.'},
          :on => :reset_password

次に、コントローラーでは次のようになります。

def change_password
  @user = current_user
  if request.post?
    @user.password = params[:password]
    @user.password_confirmation = params[:password_confirmation]
    if @user.save(:context => :reset_password)
      redirect_to user_path(current_user)
    else
      render :action => "change_password"
    end        
  end
end

他の提案されたソリューションに満足していない人に適していることを願っています.

于 2013-10-31T09:45:40.473 に答える