Учебное пособие по 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.

Другие вопросы по тегам