Учебное пособие по rails: cookie не соответствует токену запоминания
Я делаю урок Майкла Хартла по Rails, глава 8. Когда я пытаюсь найти пользователя по Remember_token, сохраненному в cookie -файле браузера, он не работает. Метод find_by возвращает NIL. Я пытался выполнить отладку, посмотрев на файл cookie токена запоминания, хранящийся в браузере, и сравнил его с токеном запоминания, хранящимся в базе данных пользователей. Они не совпадают, и я не знаю почему. Вот код для Помощника Сессии.
module SessionsHelper
def sign_in(user)
remember_token = User.new_remember_token
cookies.permanent[:remember_token] = remember_token
user.update_attribute(:remember_token, User.encrypt(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
#remember_token = User.encrypt(cookies[:remember_token])
remember_token = "71e45660fbaa69bad9fb55b912f80122a584f6af"
#@current_user ||= User.find_by(remember_token: remember_token)
@current_user ||= User.find_by_remember_token(remember_token)
end
end
Я настраивал это, чтобы попытаться выяснить, что происходит. Для отладки я закомментировал обычные строки и явно установил токен запоминания со значением, которое я вижу в базе данных - тогда приложение работает. Когда я сравниваю значение файла cookie, хранящегося в браузере, со значением токена запоминания, хранящегося в базе данных, они не совпадают.
Еще одна вещь, которую я заметил, это то, что я не могу позвонить User_find_by. Я получаю ошибку, которая говорит, что он не распознает этот метод, поэтому я закомментировал его. Однако я могу позвонить User.find_by_remember_token. Возможно, что у меня установлена неправильная версия чего-либо?
Я попытался сбросить базу данных - но я вижу это, и похоже, что у него есть все правильные столбцы.
Вот код _header.html.erb:
<header class="navbar navbar-fixed-top navbar-inverse">
<div class="navbar-inner">
<div class="container">
<%= link_to "sample app", root_path, id: "logo" %>
<nav>
<ul class="nav pull-right">
<li><%= link_to "Home", root_path %></li>
<li><%= link_to "Help", help_path %></li>
<% if signed_in? %>
<li><%= link_to "Users", '#' %></li>
<li id="fat-menu" class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
Account <b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><%= link_to "Profile", current_user %></li>
<li><%= link_to "Settings", '#' %></li>
<li class="divider"></li>
<li>
<%= link_to "Sign out", signout_path, method: "delete" %>
</li>
</ul>
</li>
<% else %>
<li><%= link_to "Sign in", signin_path %></li>
<% end %>
</ul>
</nav>
</div>
</div>
</header>
2 ответа
Похоже, проблема может быть в строке 20 в вашем SessionsHelper. Должно быть:
@current_user ||= User.find_by(remember_token: remember_token)
Вместо передачи токена запоминания в метод User.find_by() вы пытаетесь вызвать метод find_by_remember_token, который не существует.
Прежде всего, User_find_by()
это не метод. его User.find()
или же User.find_by_columnName()
где columnname
столбец в вашей базе данных, который вы хотите найти.
Кроме того, вы должны убедиться, что ваш User
Модель определена правильно. Я предполагаю, что вы следовали всем инструкциям, пока у вас есть new_remember_token
а также encrypt
методы и у вас есть create_remember_token
приватный метод? также убедитесь, что у вас есть фильтр before_create.