2012-06-27 3 views
4

Я сделал учебник Майкла Хартла, и теперь я использую его для создания проекта. Для аутентификации/авторизации я в основном использую тот же код из учебника и пример приложения, которое я создал с ним. В моем проекте, хотя выключение (уничтожить сеанс) не работает. После щелчка по ссылке выдает перенаправление на главную страницу, но в ней есть неправильные ссылки, и я все равно могу получить доступ к страницам, которые я не могу (указывая, что я все еще подписан), и я не могу выяснить, что случилось. Есть идеи?Signout not working rails 3.2

Сессии Контроллер

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 

Сессии Helper

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+\-.][email protected][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 

ответ

2

Выяснил это. Я сделал пользователей до того, как я включил действия с выводом, чтобы я мог проверить действия с подписью и подписью. Ни один из них не был создан для этих пользователей, поэтому они всегда подписывались, и не было никакого запоминающего токена для уничтожения.

0

Весь код вы представленный выглядит хорошо для меня. Уверены ли вы, что у вас есть соответствующая запись в вашем config/routes.rb, она должна выглядеть примерно так: матч '/ signout', на: 'sessions # destroy', через:: delete

+0

Только что отредактировал сообщение, чтобы показать модель, в которой будет сохранен маркер и папка маршрутов. Вся информация кажется правильной. Я не понимаю. –

0

Как вы правильно отметили, проблема связана с пользователями без запоминающего токена.

Если ваша модель пользователей имеет следующую строку:

before_save:create_remember_token 

Тогда просто Перебор и resaving каждую запись в базе данных через рельсы консоль будет работать:

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

В качестве альтернативы, грабли db:reset, а затем создайте всех новых пользователей через сайт.