“ActiveRecord::UnknownAttributeError: attribut inconnu: email_confirmation” Erreur avec rspec
Je suis en cours d'exécution dans cette erreur lors de l'exécution de mes tests. J'ai vérifié pour s'assurer que tous les email_confirmation
s sont correctement orthographiés et (à moins que je suis fou) qu'ils sont. Je suis un peu un Rails de noob, donc il pourrait être quelque chose de simple.
Utilisateur Modèle
class User < ActiveRecord::Base
attr_accessible :email, :email_confirmation, :first_name, :last_name,
:password, :password_confirmation
has_secure_password
before_save { |user| user.email = email.downcase }
validates :first_name, presence: true, length: { maximum: 25 }
validates :last_name, presence: true, length: { maximum: 25 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
validates :email_confirmation, presence: true
validates :password, presence: true, length: { maximum: 6 }
validates :password_confirmation, presence: true
end
Tests Rspec
require 'spec_helper'
describe User do
before { @user = User.new(email: "[email protected]",
first_name: "John", last_name: "Smith",
password: "foobar", password_confirmation: "foobar",
email_confirmation: "[email protected]") }
subject { @user }
it { should respond_to(:first_name) }
it { should respond_to(:last_name) }
it { should respond_to(:email) }
it { should respond_to(:email_confirmation) }
it { should respond_to(:password_digest) }
it { should respond_to(:password) }
it { should respond_to(:password_confirmation) }
it { should respond_to(:authenticate) }
it { should be_valid }
describe "when first name is not present" do
before { @user.first_name = " " }
it { should_not be_valid }
end
describe "when last name is not present" do
before { @user.last_name = " " }
it { should_not be_valid }
end
describe "when email is not present" do
before { @user.email = @user.email_confirmation = " " }
it { should_not be_valid }
end
describe "when password is not present" do
before { @user.password = @user.password_confirmation = " " }
it { should_not be_valid }
end
describe "when first_name is too long" do
before { @user.first_name = "a" * 26 }
it { should_not be_valid }
end
describe "when last_name is too long" do
before { @user.last_name = "a" * 26 }
it { should_not be_valid }
end
describe "when email format is invalid" do
it "should be invalid" do
addresses = %w[user@foo,com user_at_foo.org example.user@foo.
foo@bar_baz.com foo@bar+baz.com]
addresses.each do |invalid_address|
@user.email = invalid_address
@user.should_not be_valid
end
end
end
describe "when email format is valid" do
it "should be valid" do
addresses = %w[user@foo.COM A_US-ER@f.b.org frst.lst@foo.jp a+b@baz.cn]
addresses.each do |valid_address|
@user.email = valid_address
@user.should be_valid
end
end
end
describe "when email address is already taken" do
before do
user_with_same_email = @user.dup
user_with_same_email.email = @user.email.upcase
user_with_same_email.save
end
it { should_not be_valid }
end
describe "when password doesn't match confirmation" do
before { @user.password_confirmation = "mismatch" }
it { should_not be_valid }
end
describe "when email doesn't match confirmation" do
before { @user.email_confirmation = "[email protected]" }
it { should_not be_valid }
end
describe "when password confirmation is nil" do
before { @user.password_confirmation = nil }
it { should_not be_valid }
end
describe "when email confirmation is nil" do
before { @user.email_confirmation = nil }
it { should_not be_valid }
end
describe "with a password that's too short" do
before { @user.password = @user.password_confirmation = "a" * 5 }
it { should be_invalid }
end
describe "return value of authenticate method" do
before { @user.save }
let(:found_user) { User.find_by_email(@user.email) }
describe "with valid password" do
it { should == found_user.authenticate(@user.password) }
end
describe "with invalid password" do
let(:user_for_invalid_password) { found_user.authenticate("invalid") }
it { should_not == user_for_invalid_password }
specify { user_for_invalid_password.should be_false }
end
end
end
schéma.rb
ActiveRecord::Schema.define(:version => 20130417021135) do
create_table "users", :force => true do |t|
t.string "first_name"
t.string "last_name"
t.string "email"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.string "password_digest"
end
add_index "users", ["email"], :name => "index_users_on_email", :unique => true
end
Pouvez-vous coller votre DB schéma de la table que le dos de ce modèle?
Édité le post avec elle
Merci. Rails de support pour la confirmation de la validation intégrée, voir les suggestions ci-dessous.
Édité le post avec elle
Merci. Rails de support pour la confirmation de la validation intégrée, voir les suggestions ci-dessous.
OriginalL'auteur josephndenton | 2013-04-17
Vous devez vous connecter pour publier un commentaire.
Vous obtenez
UnknownAttributeError
parce que vous n'avez pas de colonne dans votreusers
table appeléeemail_confirmation
. Par défaut, ActiveRecord va chercher DB colonnes portant le même nom que les attributs que vous utilisez pour construire le modèle, mais cette ligne est d'essayer de construire un Utilisateur avec un attribut de la base de données ne sais pas à propos de:Êtes-vous vraiment l'intention d'enregistrer l'e-mail de confirmation dans la base de données, ou vous êtes simplement désireux de vérifier qu'elle correspond à e-mail avant de l'enregistrer? Je suppose que le dernier, et sur les Rails, en réalité, a un support intégré pour le faire:
Voir plus de détails sur la Rails de Guide pour les Validations, ou le
validates_confirmation_of
les docs de l'API. (Et vous aurez probablement besoin de faire la même chose pour:password_confirmation
.)Parfois, la migration n'est pas encore fait sur l'environnement. Numéro de commande comme
rake RAILS_ENV=production db:migrate
résout le problème.Si vous avez modifié le schéma, vous pouvez également essayer de supprimer les cookies
OriginalL'auteur Stuart M
Juste après avoir passé une tonne de temps à mettre au point mon propre exemple, j'ai pensé que je voudrais mentionner une troisième possibilité.
J'avais fait une migration correctement et vérifié par l'inspection de mon
ActiveRecord
dans la console rails. J'avais essayé de recréer mon db à partir du schéma de nombreuses fois et j'avais essayé de ré-exécuter la migration de nombreuses fois, en vain.Le problème, dans mon cas, c'est que j'ai été voir le problème lors de l'exécution de mes tests d'unité, pas au moment de l'exécution. Le problème est que ma base de données de test était sorti de la synchronisation dans ma migration/restauration de test. La solution était assez simple. Tout ce que j'avais à faire était de réinitialiser la base de données de test avec:
Cela a été un excellent ajout à la réponse. A travaillé comme annoncé!
OriginalL'auteur agarcher
Je comprends que la réponse ci-dessus est marqué correcte et résout les OP du problème. Mais il est une autre cause de cette erreur qui va restée sans effet dans un certain nombre de stackoverflow de messages sur ce sujet. Cette erreur peut se produire dans un polymorphe de nombreux de nombreux lorsque vous oubliez d'utiliser l': option pour un has_many. Par exemple:
Cela vous donne cette erreur:
lorsque vous essayez d'effectuer les opérations suivantes:
La solution est d'ajouter le :comme option pour AProfile et BProfile:
OriginalL'auteur Donato
J'ai eu le même problème et cela a fonctionné comme par magie. Ajoutez cette ligne à la fin de votre migration des énoncés pour chaque modèle, vous devez mettre à jour. Réinitialise toutes les informations mises en cache sur les colonnes, ce qui les amènera à être rechargé sur la prochaine demande.
Référence : https://apidock.com/rails/ActiveRecord/Base/reset_column_information/class
OriginalL'auteur koios
J'ai le même message d'erreur et j'ai corrigé la commande de la params comme même ordre de définition des colonnes dans la base de données:
OriginalL'auteur Hero