2012年6月8日金曜日

Rails3.2.3でhas_secure_passwordを使った際のエラー

認証画面を作る際の手順
rails g scaffold User name:string password_digest:string
rake db:migrate

ここまではいつもどおりです。

models/user.rb
class User > Activerecord::Base
  validates :name, presence: true, uniqueness: true
  has_secure_password
end

controllers/users_controller.rb
def index
  @users = User.order(:name)
...
end


Gem::LoadError in UsersController#new



bcrypt-ruby is not part of the bundle. Add it to Gemfile.
やはりエラーきましたねw
どうやらRails3.1以降になってからエラーがでるようです。
そこで
gem install bcrypt-ruby
gemfileに言われるがままに、
gem 'bcrypt-ruby' を追加
bundle install
サーバー再起動で無事認証画面が表示されました。

=============================================
has_secure_password関連で
password_confirmを追加した際に、

  <div class="field">
    <%= f.label :password_confirmation, "確認" %><br />
    <%= f.password_field :password_confirmation, size: 40 %>
  </div>
can't mess assignが出たのでこの対処法も。
どこを確認しても間違ってないんです。これに対して、has_secure_passwordが
勝手にpasswordとpassword_confirmが違う場合にエラーになるよう設定してくれます。(もちろんエラー用文言は書く必要があります)
そうです、attr_accesibleにpassword_confirmationを追加しましょう。
attr_accessible :name, :password, :password_confirmation
こうなります。解決です。