Rails Auth, Запомнить меня - PullRequest
1 голос
/ 04 марта 2012

Я пытаюсь добавить функцию запомнить меня в форму входа, следуя учебнику Райана Бейтса . Однако, когда я пытаюсь получить доступ к своим страницам, я получаю эту ошибку:

Не удалось найти пользователя с auth_token =

Я думаю, что проблема исходит от моего application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery
  helper_method  :current_user

  private

  def current_user
    @current_user ||= User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
  end
end

Вот код из моего user.rb

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

  validates_presence_of :username
  validates_uniqueness_of :username
  validates_presence_of :email
  validates_uniqueness_of :email
  validates_confirmation_of :password
  validates_presence_of :password, :on => :create

  before_create { generate_token(:auth_token) }

  def send_password_reset
    generate_token(:password_reset_token)
    self.password_reset_sent_at = Time.zone.now
    save!
    UserMailer.password_reset(self).deliver
  end

  def generate_token(column)
    begin
      self[column] = SecureRandom.urlsafe_base64
    end while User.exists?(column => self[column])
  end
end

Вот мой user_controller.rb

class UsersController < ApplicationController
  def new
    @user = User.new
   end

  def show
    @user = User.find(params[:id])
  end

  def create
    @user = User.new(params[:user])
    if @user.save
      redirect_to @user, :notice => "Signed up!"
    else
     render "new"
    end
  end
end

И, наконец, вот мой session_controller

class SessionsController < ApplicationController
  def new
  end

  def create
    user = User.find_by_username(params[:username])
    if user && user.authenticate(params[:password])
      if params[:remember_me]
        cookies.permanent[:auth_token] = user.auth_token
      else
        cookies[:auth_token] = user.auth_token
      end
      redirect_to root_url, :notice => "Logged in!"
    else
      flash.now.alert = "Invalid email or password"
      render "new"
    end
  end

  def destroy
    cookies.delete(:auth_token)
    redirect_to root_url, :notice => "Logged out!"
  end
end

Единственное, что я изменил, - это поиск пользователя по имени пользователя, а не по электронной почте, но я не понимаю, почему это может его сломать. У кого-нибудь есть идеи?

Редактировать

Моя база данных заполнена следующими миграциями

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :username
      t.string :email
      t.string :password_digest

      t.timestamps
    end
  end
end

class AddAuthTokenToUsers < ActiveRecord::Migration
  def change
    add_column :users, :auth_token, :string
  end
end

class AddPasswordResetToUsers < ActiveRecord::Migration
  def change
    add_column :users, :password_reset_token, :string
    add_column :users, :password_reset_sent_at, :datetime
  end
end
end

Вот ошибка согласно окну терминала:

ActionView::Template::Error (Couldn't find User with auth_token = ):
    1: <h1>Home</h1>
    2: 
    3: <div id="user_nav">
    4:   <% if current_user %>
    5:     Logged in as <%= current_user.email %>
    6:     <%= link_to "Log out", logout_path %>
    7:   <% else %>
  app/controllers/application_controller.rb:8:in `current_user'
  app/views/pages/home.html.erb:4:in `_app_views_pages_home_html_erb___725535246_2189699680'

Редактировать 2

Вот код для файла home.html.erb

<h1>Home</h1>

<div id="user_nav">
  <% if current_user %>
    Logged in as <%= current_user.email %>
    <%= link_to "Log out", logout_path %>
  <% else %>
    <%= link_to "Sign up", signup_path %> or 
    <%= link_to "Log in", login_path %>
  <% end %>
</div>

Ответы [ 3 ]

1 голос
/ 04 марта 2012

Это может быть не тот ответ, но вы пробовали что-то вроде:

<h1>Home</h1>

<div id="user_nav">
  <% if !current_user.auth_token.nil? %>
    Logged in as <%= current_user.email %>
    <%= link_to "Log out", logout_path %>
  <% else %>
    <%= link_to "Sign up", signup_path %> or 
    <%= link_to "Log in", login_path %>
  <% end %>
</div>

Я подозреваю, что по какой-то причине auth_token равно null для current_user.Вы также можете попробовать изменить логику примерно так:

<div id="user_nav">
    cu nil?:<%=current_user.nil?%>
    cu.at.nil?:<%=current_user.auth_token.nil? if !current_user.?nil%>
    <%= link_to "Log out", logout_path %>
    <%= link_to "Sign up", signup_path %> or 
    <%= link_to "Log in", login_path %>
</div>

... во время устранения этой проблемы.По крайней мере, это должно дать вам немного больше информации и страницу, которая загружается, пока вы копаете дальше.

0 голосов
/ 10 июля 2013

У меня возникла такая же проблема, и после прочтения всех этих постов и идей на RailsCasts я попытался обновить контроллер приложения, чтобы проверить, действительно ли возвращаемый из cookie файл auth_token содержит что-то, и он начал работать.

def current_user
    @current_user ||= User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token] && cookies[:auth_token].length > 0
end

Я не уверен, что куки [: auth_token] возвращали ноль и условное условие не перехватывало их, или если куки [: auth_token] фактически возвращали пустую строку, а User.find_by_auth_token это не понравилось,даже если он работал в консоли.

Не уверен, что это правильный путь или нет, но подумал, что я его выброшу.

Спасибо, Патрик

0 голосов
/ 07 апреля 2013

У меня была такая же проблема.Проблема возникала только у пользователей, которые были в моей базе данных до того, как я добавил поле auth_token в таблицу базы данных пользователей.Приложение Couldn't find User with auth_token, поскольку у старых пользователей не было ни одного, созданного для них, когда они регистрировались, поскольку эта функция тогда не была реализована.

Чтобы преодолеть это, я просто удалил старых пользователей из своей базы данных и подписал ихснова

Однако пользователи, которые больше не входят в систему автоматически.Чтобы преодолеть это, я изменил эту строку:

session[:user_id] = @user.id

на

cookies[:auth_token] = @user.auth_token

Поскольку я теперь использовал cookie, а несеанс для входа пользователей.

...