4

私は Michael Hartl のチュートリアルを実行しましたが、今はそれを使用してプロジェクトを構築しています。認証/承認については、基本的に、チュートリアルとそれを使用して作成したサンプル アプリと同じコードを使用しています。私のプロジェクトでは、サインアウト (セッションの破棄) が機能していません。サインアウトリンクをクリックすると、ホームページにリダイレクトされますが、ナビゲーションに間違ったリンクがあり、アクセスできないはずのページにアクセスできます (まだサインインしていることを示しています)。何が悪いのかを理解してください。何か案は?

セッションコントローラー

class SessionsController < ApplicationController
 def new
render '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'
  render 'new'
end
end

def destroy
 sign_out
 redirect_to root_path
end
end

セッションヘルパー

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 current_user?(user)
user == current_user
end

def sign_out
self.current_user = nil
cookies.delete(:remember_token)
end
end

ヘッダー リンク

  <header>
          <h1><%= link_to image_tag('logo.gif'), root_path %></h1>
           <div id="login-sec">
          <div class="login-row">
            <div class="col">

            <% if signed_in? %>

            <ul>
              <li><%= link_to "Signout", signout_path, method: "delete" %></li>
            </ul>

            <% else %>  

            <ul>
                <li><%= link_to "Forgot Password", "#" %></li>
                <li class="last"><%= link_to "New user register here", signup_path %>               </li>
            </ul>

            <br /><br /><center><%= link_to image_tag('go-btn.png'), signin_path %></center>
            <% end %>

          </div>
        </header>

ユーザー モデル (記憶トークンが作成される場所)

class User < ActiveRecord::Base
attr_accessible :company, :name, :email, :password, :password_confirmation
has_secure_password

before_save { |user| user.email = email.downcase }
before_save :create_remember_token

validates :name,  presence: true, length: { maximum: 70 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, 
                  format: { with: VALID_EMAIL_REGEX },
                  uniqueness: { case_sensitive: false }
validates :password, presence: true, length: { minimum: 6 }
validates :password_confirmation, presence: true        

private

def create_remember_token
  self.remember_token = SecureRandom.urlsafe_base64
end       
end

ルートファイル

App::Application.routes.draw do
resources :users
resources :sessions, only: [:new, :create, :destroy]

root to: 'static_pages#home'

match '/about',          to: 'static_pages#about'
match '/contact',        to: 'static_pages#contact'
match '/signup',         to: 'users#new'
match '/about-yourself', to: 'users#about-yourself'
match '/signin',         to: 'sessions#new'
match '/signout',        to: 'sessions#destroy', via: :delete
4

3 に答える 3

2

理解した。サインアウト アクションを入れる前にユーザーを作成したので、サインイン アクションとサインアップ アクションをテストできました。これらのユーザーの記憶トークンは作成されなかったため、常にサインインしており、破棄する記憶トークンはありませんでした。

于 2012-06-28T22:47:06.927 に答える
0

あなたが提示したすべてのコードは、私には問題ないように見えます。config/routes.rb に適切なエントリがあると確信していますか? match '/signout', to: 'sessions#destroy', via: :delete のようになっているはずです。

于 2012-06-27T22:21:12.067 に答える
0

ご指摘のとおり、問題は記憶トークンを持たないユーザーにあります。

ユーザー モデルに次の行がある場合:

before_save:create_remember_token

次に、Rails コンソールを介してデータベース内の各エントリをループして再保存するだけで機能します。

User.all.each { |user| user.save(validate:false)}

または、レーキdb:resetを作成してから、サイトを通じてすべての新しいユーザーを作成します。

于 2012-07-24T15:58:01.807 に答える