Rails アジャイル本 第11章 タスクF:ユーザ管理(ユーザ更新機能)

『Rails によるアジャイルWebアプリケーション開発 第11章 タスクF:ユーザ管理』の自由課題のユーザ更新機能の作り替え問題。

app/views/users/new.html.erb テンプレートを app/views/users/edit.html.erb にコピーして submit ボタンのラベル部分のみ修正する。

ただ、このままだと password_non_blank のバリデーションが上手く働かない。
パスワード入力フォームが空のままの場合、password= メソッドで pwd.blank? が真となりすぐメソッドから抜け出すが、hashed_password には古いハッシュ値が残されたままとなり、password_non_blank の条件節 hashed_password.blank? は常に偽となる。

そこで、password= メソッド開始時に hashed_password を空白文字列で初期化しておく。

app/models/user.rb

def password=(pwd)
  self.hashed_password = ""
  @password = pwd
  return if pwd.blank?
  create_new_salt
  self.hashed_password = User.encrypted_password(self.password, self.salt)
end

さらに、本人確認のパスワード入力フォームも追加してみる。

テンプレート app/views/users/edit.html.erb に本人確認のパスワードフィールドを追加する。

<div>
  <%= f.label :old_password, 'Your Password' %><br />
  <%= f.password_field :old_password, :size => 40 %>
</div>

User モデル app/models/user.rb に old_password のバリデーションとアクセサを追加する。
これは、更新のみで利用するのでバリデーションは update のみ作用させる。

validates_presence_of :old_password, :on => :update

attr_accessor :password_confirmation, :old_password

コントローラ app/controllers/users_controller.rb の update メソッドでユーザ確認を行う。

unless User.authenticate(@user.name, params[:user][:old_password])
  redirect_to(:action => 'index')
  flash[:notice] = 'wrong passowrd'
  return
end

これで、本人のみ更新が可能になった。

RailsによるアジャイルWebアプリケーション開発
Sam Ruby David Heinemeier Hansson Dave Thomas
オーム社
売り上げランキング: 29946
«
»