質問編集履歴

1 情報の追加

s.k

s.k score 409

2016/09/17 11:29  投稿

TypeError: :BCrypt is not a class/moduleに関して
こんにちは!
表題の件です。
現在、railsチュートリアルでログイン実装(第8章)を勉強しています。
今は、ちょうどrememberのテストをしました。
そのテストでエラーが出たのですが、いまいち理解できない表記がされました。
みなさんにお聞きしたいので載せます。
【bundle exec rake test】
```
 1) Error:
SessionHelperTest#test_current_user_returns_nil_when_remember_digest_is_wrong:
TypeError: :BCrypt is not a class/module
   app/models/user.rb:14:in `digest'
```  
 
 
【user.rb】  
```  
class User < ActiveRecord::Base  
   attr_accessor:remember_token  
   before_save{self.email = email.downcase}  
   validates:name, presence: true, length: { maximum: 50}  
   VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i  
   validates:email, presence: true, length: {maximum: 255 },  
                             format:{with: VALID_EMAIL_REGEX},  
                             uniqueness: {case_sensitive: false}  
   has_secure_password  
   validates :password, presence: true, length: {minimum: 6}  
     
 
   def User.digest(string)  
       cost = ActiveModel::SecurePassword.min_cost?BCrypt::Engine::MIN_COST:BCrypt::Engine.cost  
       BCrypt::Password.create(string, cost: cost)  
   end  
     
   def User.new_token  
       SecureRandom.urlsafe_base64  
   end  
     
   def remember  
       self.remember_token = User.new_token  
       update_attribute(:remember_digest, User.digest(remember_token))  
   end  
     
   def remember_token  
       self.remember_token = User.new_token  
       update_attribute(:remember_digest, User.digest(remember_token))  
   end  
     
   def authenticated?(remember_token)  
       return false if remember_digest.nil?  
       BCrypt::Password.new(remember_digest).is_password?(remember_token)  
   end  
     
   def forget  
       update_attribute(:remember_digest, nil)  
   end  
     
end  
```
【sessions_helper.rb】
```
module SessionsHelper
   
   def log_in(user)
       session[:user_id]=user.id
   end
   
   def remember(user)
       user.remember
       cookies.permanent.signed[:user_id] = user.id
       cookies.permanent[:remember_token] = user.remember_token
   end
   
   def current_user
       if(user_id = session[:user_id])
         @current_user ||= User.find_by(id: user_id)
       elsif(user_id = cookies.signed[:user_id])
        user = User.find_by(id: user_id)
         if user && user.authenticated?(cookies[:remember_token])
            log_in user
            @current_user = user
         end
       end
   end
   
   def logged_in?
       !current_user.nil?
   end
   
   def forget(user)
       user.forget
       cookies.delete(:user_id)
       cookies.delete(:remember_token)
   end
   
   def log_out
       forget(current_user)
       session.delete(:user_id)
       @current_user = nil
   end
end
```
【sessions_controller】
```
class SessionsController < ApplicationController
 def new
 end
 
 def create
   user = User.find_by(email: params[:session][:email].downcase)
   if user && user.authenticate(params[:session][:password])
     log_in user
     params[:session][:remember_me]=='1'?remember(user):forget(user)
     redirect_to user
   else
     flash.now[:danger]='Invalid email/password combination'
   render 'new'
   end
 end
 
 def destroy
   log_out if logged_in?
   redirect_to root_url
 end
 
 
end
```
エラーの意味をお聞きしたいです。
よろしくお願いします。
  • Ruby on Rails 4

    2643 questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る