2012-04-29 15 views
6

Este capítulo es en la adición de recordar fichas para garantizar que el usuario signin estado es recordado y que la sesión sólo se borra cuando el usuario firma explícitamente. Entiendo la importancia de tener esta característica en mi aplicación, así que quiero asegurarme de que funciona correctamente. Me estoy poniendo un montón de errores, sin embargo, cuando corroCapítulo 8 carriles Tutorial Recuerde errores Token

$ bundle exec rspec spec/ 

y sospecho que tienen que ver con mi modelo de usuario, ya que todos menos uno contienen:

NoMethodError: 
     undefined method `remember_token=' for #<User:...> 

y el último contiene

Failure/Error: it { should respond_to(:remember_token) } 

y luego apunte a mis user_spec.rb, user.rb y authentication_pages_spec.rb y archivos, que he incluido la mayor parte de (las partes pertinentes) aquí.

user.rb:

# == Schema Information 
# 
# Table name: users 
# 
# id   :integer   not null, primary key 
# name  :string(255) 
# email  :string(255) 
# created_at :datetime  not null 
# updated_at :datetime  not null 
# 

class User < ActiveRecord::Base 
    attr_accessible :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: 50 } 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    validates :email, presence: true, 
        format:  { with: VALID_EMAIL_REGEX }, 
        uniqueness: { case_sensitive: false } 
    validates :password, length: { minimum: 6 } 
    validates :password_confirmation, presence: true 

    private 

     def create_remember_token 
     self.remember_token = SecureRandom.urlsafe_base64 
     end 
end 

authentication_pages_spec.rb:

require 'spec_helper' 

describe "Authentication" do 

    subject {page} 
    describe "signin page" do 
    before { visit signin_path } 
    it {should have_selector('h1', text: 'Sign in')} 
    it {should have_selector('title', text: 'Sign in')} 
    end 

    describe "signin" do 
    before {visit signin_path} 

    describe "with invalid information" do 
     before {click_button "Sign in"} 

     it {should have_selector('title', text: 'Sign in')} 
     it {should have_selector('div.alert.alert-error', text: 'Invalid')} 

     describe "after visiting another page" do 
       before { click_link "Home" } 
       it { should_not have_selector('div.alert.alert-error') } 
      end 
    end 

    describe "with valid information" do 
      let(:user) { FactoryGirl.create(:user) } 
      before do 
      fill_in "Email", with: user.email 
      fill_in "Password", with: user.password 
      click_button "Sign in" 
      end 

      it { should have_selector('title', text: user.name) } 
      it { should have_link('Profile', href: user_path(user)) } 
      it { should have_link('Sign out', href: signout_path) } 
      it { should_not have_link('Sign in', href: signin_path) } 
      end 
    end 
end 

y el comienzo de user_spec.rb:

# == Schema Information 
# 
# Table name: users 
# 
# id   :integer   not null, primary key 
# name  :string(255) 
# email  :string(255) 
# created_at :datetime  not null 
# updated_at :datetime  not null 
# 

require 'spec_helper' 

describe User do 

    before do 
     @user = User.new(name: "Example User", email: "[email protected]", 
         password: "foobar", password_confirmation: "foobar") 
    end 

    subject { @user } 

    it { should respond_to(:name) } 
    it { should respond_to(:email) } 
    it { should be_valid } 
    it { should respond_to(:password_digest) } 
    it { should respond_to(:password) } 
    it { should respond_to(:password_confirmation) } 
    it { should respond_to(:authenticate) } 
    it { should respond_to(:remember_token) } 

    describe "remember token" do 
     before { @user.save } 
     its(:remember_token) { should_not be_blank } 
    end 
. 
. 
. 

Cualquier ayuda sería muy apreciada!

Respuesta

4

Si recibe este error en la producción de Heroku, después de ejecutar:

heroku run rake db:migrate 

debe reiniciar su aplicación:

heroku restart 
+0

Esto solucionó mi problema ya que solo estaba en Heroku. Traté de probar el registro antes de migrar. Después de eso, incluso 'heroku run db: migrate' no solucionaría el problema. Como de costumbre, debería haber intentado apagarlo y encenderlo de nuevo. – brodney

2

Quizás quiso generar la migración para añadir la columna al modelo de usuario?

$ rails generate migration add_remember_token_to_users 

Después de esta edición del archivo de migración para añadir el nuevo campo remember_token

y

Después de que lo que necesita hacer

$ bundle exec rake db:migrate 
$ bundle exec rake db:test:prepare 

Sus anotaciones en el modelo no muestran la columna. Asegúrate de haber ejecutado los comandos anteriores.

+1

Gracias por su respuesta! Yo había generado la migración, pero no había agregado el nuevo campo. Sin embargo, cuando agregué la columna y el índice y ejecuté los comandos db, obtuve los mismos errores. Por lo tanto, eliminé el archivo _add_remember_token_to_users por una simple 'rm' en el directorio, y luego volví a ejecutar los comandos. Mi archivo ahora se parece a {AddRememberTokenToUsers de marcas skirmishdirmish

+0

compruebe en la tabla si existe la columna – rangalo

+0

Sí. ¿Crees que sería mejor simplemente deshacer todos estos cambios y comenzar de cero? Si es así, ¿podría indicarme la forma más segura de hacerlo sin dañar otros archivos? – skirmishdirmish

-1

yo sólo tenía el mismo problema, conseguir método no definido find_by_remember_token.

Aquí es lo que hice para solucionarlo:

heroku run rake db:migrate 

Luego empuje a heroku nuevo

git push heroku 
2

que tiene prueba similar fallar error. lo que hice fue generar la columna remember_token con un tipo de cadena.

rails generate migration add_remember_token_to_users remember_token:string --force 

rake db:migrate RAILS_ENV=test 

después de eso, pase de prueba.

+0

Esto funcionó para mí cuando encontré el problema. La pregunta es "por qué", pero supongo que lo sabré cuando bucee más profundo. – MarsAtomic

0

me encontré con el mismo problema mientras se aprende Mhartl tutorial.I resolvió. Este problema aparece cuando tu base de datos ya tiene algunos datos de usuario, entonces la migración "remember_token" no funcionará. debe limpiar su fecha primero, luego hacer db: migrar.de esta manera:

rake db: caída db: crear rake db: migrate (ten cuidado: esto borrará todos los datos)

esperanza ayuda

Cuestiones relacionadas