2012-08-27 12 views
5

he acabado Chapter 6 of railstutorial pero toda mi User model specs no he empezado poco después añadí password & password_confirmation con los siguientes errores:railstutorial.org, Capítulo 6. atributo desconocido: contraseña

Failures: 

    1) User 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    2) User 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    3) User 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    4) User 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    5) User 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    6) User 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    7) User 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    8) User when name is not present 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    9) User when email is not present 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    10) User when name is too long 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    11) User when email format is invalid should be invalid 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    12) User when email format is valid should be valid 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    13) User when email address is already taken 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    14) User when password is not present 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    15) User when password confirmation is nil 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    16) User when password doesn't match confirmation 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    17) User return value of authenticate method with valid password 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    18) User return value of authenticate method with invalid password 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    19) User return value of authenticate method with invalid password 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

    20) User with a password that's too short 
    Failure/Error: @user = User.new(name: "Example User", email: "[email protected]", 
    ActiveRecord::UnknownAttributeError: 
     unknown attribute: password 
    # ./spec/models/user_spec.rb:17:in `new' 
    # ./spec/models/user_spec.rb:17:in `block (2 levels) in <top (required)>' 

Finished in 7.43 seconds 
39 examples, 20 failures, 5 pending 

Failed examples: 

rspec ./spec/models/user_spec.rb:22 # User 
rspec ./spec/models/user_spec.rb:23 # User 
rspec ./spec/models/user_spec.rb:24 # User 
rspec ./spec/models/user_spec.rb:25 # User 
rspec ./spec/models/user_spec.rb:26 # User 
rspec ./spec/models/user_spec.rb:27 # User 
rspec ./spec/models/user_spec.rb:28 # User 
rspec ./spec/models/user_spec.rb:32 # User when name is not present 
rspec ./spec/models/user_spec.rb:37 # User when email is not present 
rspec ./spec/models/user_spec.rb:42 # User when name is too long 
rspec ./spec/models/user_spec.rb:46 # User when email format is invalid should be invalid 
rspec ./spec/models/user_spec.rb:57 # User when email format is valid should be valid 
rspec ./spec/models/user_spec.rb:73 # User when email address is already taken 
rspec ./spec/models/user_spec.rb:78 # User when password is not present 
rspec ./spec/models/user_spec.rb:83 # User when password confirmation is nil 
rspec ./spec/models/user_spec.rb:88 # User when password doesn't match confirmation 
rspec ./spec/models/user_spec.rb:96 # User return value of authenticate method with valid password 
rspec ./spec/models/user_spec.rb:102 # User return value of authenticate method with invalid password 
rspec ./spec/models/user_spec.rb:103 # User return value of authenticate method with invalid password 
rspec ./spec/models/user_spec.rb:109 # User with a password that's too short 
rake aborted! 

el modelo de usuario se puede encontrar here Ahora, ya he comparado la fuente con el original, pero parece que me falta algo. No sé qué es

¿Alguien me puede decir por qué viene este error?

Respuesta

7

Añadir:

attr_accessor :password, :password_confirmation 

El tutorial a continuación, le hará ahorrar un digesto en password_digest

+0

así que necesito agregar 'attr_accessible' y' attr_accessor'? Pero en [código fuente de muestra] (https://github.com/railstutorial/sample_app_2nd_ed/blob/master/spec/models/user_spec.rb), ¿solo se usa 'attr_accesible'? – CuriousMind

+2

Sí, necesita ambos, cada uno con un objetivo diferente. Falta en el tutorial – apneadiving

+0

Genial, gracias por ayudar :) – CuriousMind

16

Sólo tiene que añadir has_secure_password en un archivo de modelo de usuario si no lo ha hecho todavía.

class User < ActiveRecord::Base 
attr_accessible :email, :name, :password, :password_confirmation 
has_secure_password 
# .. 
end 
+1

Esta es la mejor solución, ya que el solo hecho de agregar 'attr_accessible' generará otro error ya que el método' authenticate' no estará definido. Esto corrige ambos errores. – smessing

0

Se produce estos errores debido a que el primer bloque de before {} está tratando de agregar dos atributos que el modelo de usuario no especifica - password y password_confirmation.

Dado que este bloque before {} se ejecuta antes de cada prueba (ese es el punto), se obtiene un error en cada prueba y todas fallan. No es que la prueba está fallando, per se, sino más bien ActiveRecord no sabe qué hacer con esos atributos y está produciendo un error antes de cada prueba es realmente incluso ejecutar:

ActiveRecord::UnknownAttributeError: 
unknown attribute: password 

como dice la respuesta de codeneko, este se soluciona simplemente avanzando en el tutorial y poniendo has_secure_password en el archivo del modelo de usuario. Esto indica ActiveRecord para aceptar los atributos password y password confirmation y pasarán todas las pruebas.

Desafortunadamente, el tutorial le dice que haga un comentario has_secure_password, por lo que utilizar la respuesta de buceo como suplente probablemente no sea una mala idea hasta que el tutorial lo haya eliminado.

1

Acabo de tener el mismo problema. Estaba haciendo esto en Cloud9.

Me di cuenta de que mis pruebas tampoco funcionaban todas.

Al actualizar mi árbol de archivos se corrigieron estos dos problemas.

no necesitaba poner: contraseña o: password_confirmation directamente en el modelo (o hacer cualquier cambio de codificación en absoluto de la clase particular

1

terminé de pasar unas horas y no podía encontrar ninguna respuesta. . Mi problema terminó siendo en la línea downcase:.

before_save { self.email = email.downcase } 

se especifica que se puede hacer esta línea de una manera diferente que hice Ver abajo

https://www.railstutorial.org/book/_single-page#sec-creating_and_authenticating_a_user

.

En el Listado 6.31, podríamos haber escrito la asignación como self.email = self.email.downcase (donde self se refiere al usuario actual), pero dentro del modelo de usuario la palabra clave self es opcional en el lado derecho: self. email = email.downcase

No lo hagas de esta manera. Me dio mensajes de error cada vez hasta que invirtió a before_save { self.email = email.downcase }

y quité: self.email = self.email.downcase

soy un novato así que no está completamente seguro de por qué esto hizo que la diferencia pero lo hizo.

0

Creo que la respuesta aceptada, para agregar attr_accessor :password, :password_confirmation para el modelo de usuario es incorrecto. Porque si has_secure_password crea esos atributos de manera virtual, eso significa que lo hace por algún motivo (seguridad). Así solución podría ser solicitar la Bcrypt donde se crea un objeto de prueba del usuario:

require 'bcrypt' 

    @user = User.new(name: 'test', password: BCrypt::Password.create("my password"), password_confirmation: 'my password') 

escribí sobre esto en este post:

Rails - Unknown attribute password

Por favor, corríjanme si estoy equivocado.

Cuestiones relacionadas