Rails 3.1: has_secure_passwordメソッド
2011/05/27
この前のエントリーでは、Rails 3.1で登場した assign_attributes という渋いメソッドについて書きました。
今回紹介するのも渋い新仕様です。その名も has_secure_password。
いま、User というモデルがあるとします。データベーステーブル users には
namepassword_digest
という2つのカラムがあります。いずれも文字列型です。
app/models/user.rb を次のように書き換えます。
class User < ActiveRecord::Base has_secure_password end
これで準備完了です。
rails c でRailsコンソールを起動してください。
まず、Userオブジェクトを作ります。
> User.create!(:name => "tsutomu", :password => "jumbo", :password_confirmation => "jumbo")
驚くべきことに、このコードはエラーを引き起こしません。Rails 3.0までは
class User < ActiveRecord::Base attr_accessor :password, :password_confirmation end
と記述する必要がありましたが、クラスメソッド has_secure_password で一発です。
バリデーションもやってくれます。
> user0 = User.new(:name => "hanako", :password => "abc", :password_confirmation => "xyz") > user0.valid? => false > user0.errors.full_messages => ["Password doesn't match confirmation"]
さらには、ユーザー認証(authentication)までできます。
> user1 = User.find_by_name("tsutomu")
> user1.authenticate("detarame")
=> false
> user1.authenticate("jumbo")
=> #<User id: 1, name: "tsutomu", ...
便利になりましたね。
