2013-04-17 15 views
12

Testlerimi çalıştırırken bu hatayı yaşıyorum. Ben tüm email_confirmation s doğru yazıldığından emin olmak için kontrol ettim ve (deli olduğum sürece) onlar. Biraz Rails noob'um, bu yüzden basit bir şey olabilir."ActiveRecord :: UnknownAttributeError: unknown attribute: email_confirmation" rspec ile hata oluşuyor

Kullanıcı Modeli

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+\-.][email protected][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 

RSpec testleri

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[[email protected],com user_at_foo.org [email protected] 
          [email protected]_baz.com [email protected]+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[[email protected] [email protected] [email protected] [email protected]] 
     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 

schema.rb aradığınız senin users tabloda bir sütunu yok çünkü UnknownAttributeError alıyoruz

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 
+1

ile sıfırlamaktı: DB şemanızı bu modele dayanan tabloya yapıştırabilir misiniz? –

+0

Yayını – josephndenton

+0

ile düzenleyin. Rayların yerleşik doğrulama onayı için desteği var, aşağıdaki öneriye bakın. –

cevap

19

email_confirmation. Varsayılan olarak, ActiveRecord, modeli oluşturmak için kullandığınız nitelikler aynı adlı DB sütunlar için inceler, ancak bu hat veritabanı bilmediği bir özelliği olan bir kullanıcı oluşturmak için çalışıyor:

before { @user = User.new(email: "[email protected]", 
         first_name: "John", last_name: "Smith", 
         password: "foobar", password_confirmation: "foobar", 
         email_confirmation: "[email protected]") } 

Are E-posta onayını gerçekten veritabanında kaydetmeyi mi düşünüyorsunuz yoksa yalnızca kaydetmeden önce e-postayla eşleştiğini kontrol etmek istiyor musunuz? Ben ikinci varsayalım ve Raylar aslında yerleşik destek sadece yapmak için:

class User < ActiveRecord::Base 
    validates :email, :confirmation => true 
    validates :email_confirmation, :presence => true 
end 

Rails Guide to Validations veya validates_confirmation_of API dokümanlar üzerinde daha fazla ayrıntı verilmiştir. (Ve muhtemelen :password_confirmation için de aynı şeyi yapmalısınız.)

+0

Aynı sorunu yaşadım. DB şeması problemdi (göç olduğunu düşündüm). Teşekkürler! – Jeff

+1

Bazen göç henüz belirli bir ortamda yapılmıyor. Sorgu gibi komut "RAILS_ENV = üretim db: migrate" sorunu çözüyor. –

+0

Şemayu değiştirdiyseniz, çerezleri silmeyi de deneyebilirsiniz. –

10

Yukarıdaki sorunun doğru olarak işaretlendiğini ve OP'nin sorununu çözdüğünü anlıyorum. Ancak, bu konuyla ilgili bir dizi stackoverflow gönderisinde fark edilmeyen bu hatanın başka bir nedeni vardır. Bu hata, bir has_many için as: seçeneğini kullanmayı unuttuğunuzda, bir çok polimorfikte ortaya çıkabilir. Örneğin:

class AProfile < ActiveRecord::Base 
    has_many :profile_students 
    has_many :students, through: :profile_students 
end 

class BProfile < ActiveRecord::Base 
    has_many :profile_students 
    has_many :students, through: :profile_students 
end 

class ProfileStudent < ActiveRecord::Base 
    belongs_to :profile, polymorphic: :true 
    belongs_to :student 
end 

class Student < ActiveRecord::Base 
    has_many :profile_students 
    has_many :aprofiles, through: :profile_students 
    has_many :bprofiles, through: :profile_students 
end 

Bu size bu hatayı verecektir: AProfile seçeneği gibi:

a = AProfile.new 
a.students << Student.new 

çözüm eklemektir: aşağıdakileri yapmanız çalıştığınızda

Getting “ActiveRecord::UnknownAttributeError: unknown attribute: profile_id 

ve BProfile:

class AProfile < ActiveRecord::Base 
    has_many :profile_students, as: :profile 
    has_many :students, through: :profile_students 
end 

class BProfile < ActiveRecord::Base 
    has_many :profile_students, as: :profile 
    has_many :students, through: :profile_students 
end 
-1

Bana mesaj hatası ve ben veritabanında sütunlar tanımının aynı sırayla olarak params sipariş Düzeltildi:

CONTROLLER

def create 
    worktime = Worktime.create(name: params[:name], workhours: params[:workhours], organization: @organization, workdays: params[:workdays]) 

    render json: worktime 
end 

DATABASE

Table: worktimes 
Columns: 
id int(11) AI PK 
name varchar(255) 
workhours text 
organization_id int(11) 
workdays text 
+5

Sahip olduğum her hangi bir sorun olduğunda, parametreleri belirli bir sıraya koyarak çözülmediğinden% 99.999 eminim. Eğer öyleyse başka bir şey oyundaydı. – DickieBoy

9

sadece bu benim kendi örneğini ayıklama zaman bir ton geçirmiş olması, düşünce Üçüncü bir olasılıkla bağlantı kurardım.

Doğru bir geçiş yaptım ve ActiveRecord rayları konsolunda denetleyerek bunu doğruladım. DB'mimi şemadan tekrar tekrar oluşturmaya çalıştım ve göçü tekrar tekrar çalıştırmayı denedim, hepsi boşuna.

Sorun, benim durumumda, çalışma zamanında değil, birim testlerimi çalıştırırken sorun olduğunu görmekti. Sorun şu ki, test veritabanım taşıma/geri alma testimde senkronizasyondan çıkarıldı. Çözüm oldukça basitti. Yapmam gereken tek şey test veritabanını

rake db:test:prepare 
+0

İyi yakalama. Benim durumum biraz farklıydı. Rails 5.0.0.1'de SQL şema formatı vardı ve ben db: bir kez geri al ve db: tekrar geçiş yaptım. Geri alma ve geçiş arasında son db geçiş dosyasını değiştirdim. Http://edgeguides.rubyonrails.org/active_record_migrations.html#changing-existing-migrations belgesinde belirtildiği gibi bu model önerilmemektedir, ancak erken gelişim için kullanışlı olabilir. Gerçekten neden ve nasıl oluşturulduğunu bilmiyorum, ama struct.sql şemasının benim için bir sorun olduğunu ve onu silmem ve db'yi çalıştırmam gerekti. – bhtabor

+0

Bu, cevaba büyük bir katkıydı. İlan edildiği gibi çalıştı! – jlbenc

İlgili konular