Rails 3.1: has_secure_passwordメソッド

2011/05/27

この前のエントリーでは、Rails 3.1で登場した assign_attributes という渋いメソッドについて書きました。

今回紹介するのも渋い新仕様です。その名も has_secure_password

いま、User というモデルがあるとします。データベーステーブル users には

  • name
  • password_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", ...

便利になりましたね。