Rails Auth, Recuerdame

Intento agregar la funcionalidad de recordar mi formulario de inicio de sesión siguiendo el tutorial de Ryan Bates . Sin embargo, cuando bash acceder a mis páginas recibo este error:

No se pudo encontrar el usuario con auth_token =

Creo que el problema viene de mi 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 

Aquí está el código de mi usuario.rb

 class User  :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 

Aquí está mi user_controller.rb

 class UsersController  "Signed up!" else render "new" end end end 

Y finalmente aquí están mis sesiones_controller

 class SessionsController  "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 

Lo único que cambié fue encontrar al usuario por nombre de usuario en lugar de correo electrónico, pero no puedo ver por qué eso lo rompería. ¿Alguien tiene alguna idea?

Editar

Mi base de datos está poblada por las siguientes migraciones.

 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 

Aquí está el error de acuerdo a la ventana del terminal:

 ActionView::Template::Error (Couldn't find User with auth_token = ): 1: 

Home

2: 3:
4: 5: Logged in as 6: 7: 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'

Editar 2

Aquí está el código para el archivo home.html.erb

 

Home

Logged in as or

Esto puede no ser la respuesta, pero ¿has intentado algo como:

 

Home

<% 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 %>

Sospecho que, por alguna razón, auth_token es nulo para current_user. También puedes intentar modificar la lógica a algo como:

 
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 %>

… mientras estás depurando este problema. Al menos eso debería brindarte un poco más de información y una página que se carga mientras sigues investigando.

Tuve el mismo problema. El problema solo estaba ocurriendo para los usuarios que tenía en mi base de datos antes de agregar el campo auth_token a la tabla de la base de datos de usuarios. La aplicación Couldn't find User with auth_token ya que los usuarios más antiguos no tenían uno creado para ellos cuando se registraron ya que esta funcionalidad no se implementó en ese momento.

Para superar esto, simplemente eliminé los usuarios antiguos de mi base de datos y los volví a registrar.

Sin embargo, los usuarios ya no se registran automáticamente. Para superar esto cambié esta línea:

session[:user_id] = @user.id

a

cookies[:auth_token] = @user.auth_token

Como ahora estaba usando una cookie en lugar de una sesión para iniciar sesión en los usuarios.

Estaba teniendo el mismo problema y, después de leer todas estas publicaciones y las ideas de RailsCasts, intenté actualizar el controlador de la aplicación para comprobar si el auth_token que se devolvía de la cookie realmente contenía algo y empezó a funcionar.

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

No estoy seguro de si las cookies [: auth_token] devolvieron un valor nulo y el condicional no las detectó o si las cookies [: auth_token] realmente devolvieron una cadena vacía y al Usuario.find_by_auth_token no le gustó, aunque funcionó en la consola.

No estoy seguro de si esta es la forma correcta de ir o no, pero pensé que lo tiraría por ahí.

Gracias patrick