Выйти неработающие рельсы 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
Помощник сессий
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
3 ответа
Догадаться. Я создал пользователей перед тем, как добавить действия по выходу из системы, чтобы можно было проверить действия по входу и выходу из системы. Для этих пользователей не был создан токен запоминания, поэтому они всегда входили в систему, а токен запоминания не был уничтожен.
Как вы правильно заметили, проблема заключается в пользователях без токена запоминания.
Если модель вашего пользователя имеет строку:
before_save:create_remember_token
Тогда простой цикл и повторное сохранение каждой записи в базе данных через консоль rails будет работать:
User.all.each { |user| user.save(validate:false)}
Как вариант, грабли db:reset
а затем создать всех новых пользователей через сайт.
Весь код, который вы представили, выглядит хорошо для меня. Вы уверены, что у вас есть соответствующая запись в вашем config/rout.rb, она должна выглядеть примерно так: "/signout", чтобы: "session #destroy", через::delete