サインインに関しては、このチュートリアルに従っています。サインアップの章は今のところスキップしたので、ユーザーをハードコーディングしています。私はそれを非常に慎重に追跡しました(現在約4回)が、セッション、特にcurrent_userにまだ問題があります。
セッションヘルパー:
module SessionsHelper
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
self.current_user = user
end
def signed_in?
!current_user.nil?
end
def current_user=(user)
@current_user = user
end
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
def sign_out
self.current_user = nil
cookies.delete(:remember_token)
end
end
session_controller:
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by_email(params[:session][:email])
if user && user.authenticate(params[:session][:password])
sign_in user
redirect_to user
else
flash.now[:error] = 'Invalid email/password combination' # Not quite right!
render 'new'
end
end
def destroy
sign_out
redirect_to root_url
end
end
ユーザーモデル:
class User < ActiveRecord::Base
attr_accessible :first_name, :last_name, :email, :password
has_secure_password
before_save :create_remember_token
has_and_belongs_to_many :projects
belongs_to :project
belongs_to :ticket
validates :first_name, presence: true, length: { maximum: 24 }
validates :last_name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }
validates :password, presence: true, length: { minimum: 6 }
private
def create_remember_token
self.remember_token = SecureRandom.urlsafe_base64
end
end
例:
<% if signed_in? %>
<li><%= link_to "Create projekt", :controller => "projects", :action => "new" %>
<% end %>
アプリケーションを実行していると、ログインしていると表示されます (ログインしているユーザーにのみ表示されるすべてのものが表示され、その逆も同様です)。Cookie をクリアしようとしたり、ブラウザを再起動したり、別のブラウザを試したりしましたが、同じです。
問題は、(sessions_helper.rb で) 次から変更した場合です。
def signed_in?
!current_user.nil?
end
に...
def signed_in?
current_user.nil?
end
..つまり、「!」を削除します。ログイン/ログアウトが機能し、正しいリンクが表示されます。しかし、それは実際には「nil」であるため、 current_user を使用できないことも意味します。
問題は、なぜ current_user が nil なのかということです。コードの何が問題になっていますか?
ユーザーのデータベースモデルは次のとおりです。
first_name | varchar(25)
last_name | varchar(50)
email | varchar(255)
created_at | datetime
updated_at | datetime
password_digest | varchar(255)
password | varchar(255)
remember_token | varchar(255)