Rails アジャイル本 第11章 タスクF:ユーザ管理(ユーザ更新機能)
2010年03月25日
『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アプリケーション開発
posted with amazlet at 10.03.15
Sam Ruby David Heinemeier Hansson Dave Thomas
オーム社
売り上げランキング: 29946
オーム社
売り上げランキング: 29946