0

サインインに関しては、このチュートリアルに従っています。サインアップの章は今のところスキップしたので、ユーザーをハードコーディングしています。私はそれを非常に慎重に追跡しました(現在約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)
4

1 に答える 1

0

問題は最終的に解決され、データベース内のすべての(テスト)ユーザーを削除し、新しいユーザーを(シードで)作成することで解決されました。

アプリと db モデルに変更が適用される前にユーザーが作成されたため、おそらく問題が発生しました。

于 2013-02-06T23:28:37.497 に答える