2013-04-29 3 views
1

Я получаю следующее сообщение об ошибке после выполнения моих тестов в консоли:Почему в таблице моих пользователей нет ошибки столбца?

ActiveRecord::StatementInvalid: SQLite3::SQLException: table users has no column named password: INSERT INTO "users" 

user_test.rb:

class UserTest < ActiveSupport::TestCase 
    test "a user should enter a first name" do 
    user = User.new 
    assert !user.save 
    assert !user.errors[:first_name].empty? 
    end 

    test "a user should enter a last name" do 
    user = User.new 
    assert !user.save 
    assert !user.errors[:last_name].empty? 
    end 

    test "a user should enter a profile name" do 
    user = User.new 
    assert !user.save 
    assert !user.errors[:profile_name].empty? 
    end 

    test "a user should have a unique profile name" do 
    user = User.new 
    user.profile_name = users(:adam).profile_name 

    assert !user.save 
    assert !user.errors[:profile_name].empty? 
    end 
end 

users.rb:

class User < ActiveRecord::Base 
# Include default devise modules. Others available are: 
# :token_authenticatable, :confirmable, 
# :lockable, :timeoutable and :omniauthable 
devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 

# Setup accessible (or protected) attributes for your model 
attr_accessible :email, :password, :password_confirmation, :remember_me, 
     :first_name, :last_name, :profile_name 

validates :first_name, presence: true 

validates :last_name, presence: true 

validates :profile_name, presence: true, 
     uniqueness: true 

has_many :statuses 

def full_name 
first_name + " " + last_name 
end 
end 

users.yml:

dan: 
    first_name: "Dan" 
    last_name: "Can" 
    email: "[email protected]" 
    profile_name: "dan" 
    password: "123456" 
    password_confirmation: "123456" 

database.yml:

# SQLite version 3.x 
# gem install sqlite3 
# 
# Ensure the SQLite 3 gem is defined in your Gemfile 
# gem 'sqlite3' 
development: 
adapter: sqlite3 
database: db/development.sqlite3 
pool: 5 
timeout: 5000 

# Warning: The database defined as "test" will be erased and 
# re-generated from your development database when you run "rake". 
# Do not set this db to the same as development or production. 
test: 
    adapter: sqlite3 
    database: db/test.sqlite3 
    pool: 5 
    timeout: 5000 

production: 
    adapter: sqlite3 
    database: db/production.sqlite3 
    pool: 5 
    timeout: 5000 

Что я считаю мой пользователь мигрирует файл:

class DeviseCreateUsers < ActiveRecord::Migration 
def change 
    create_table(:users) do |t| 
    t.string :first_name 
    t.string :last_name 
    t.string :profile_name 

    ## Database authenticatable 
    t.string :email,    :null => false, :default => "" 
    t.string :encrypted_password, :null => false, :default => "" 

    ## Recoverable 
    t.string :reset_password_token 
    t.datetime :reset_password_sent_at 

    ## Rememberable 
    t.datetime :remember_created_at 

    ## Trackable 
    t.integer :sign_in_count, :default => 0 
    t.datetime :current_sign_in_at 
    t.datetime :last_sign_in_at 
    t.string :current_sign_in_ip 
    t.string :last_sign_in_ip 

    ## Confirmable 
    # t.string :confirmation_token 
    # t.datetime :confirmed_at 
    # t.datetime :confirmation_sent_at 
    # t.string :unconfirmed_email # Only if using reconfirmable 

    ## Lockable 
    # t.integer :failed_attempts, :default => 0 # Only if lock strategy is  :failed_attempts 
    # t.string :unlock_token # Only if unlock strategy is :email or :both 
    # t.datetime :locked_at 

    ## Token authenticatable 
    # t.string :authentication_token 


    t.timestamps 
end 

add_index :users, :email,    :unique => true 
add_index :users, :reset_password_token, :unique => true 
end 
end 

Я хотел бы знать, что является причиной ошибки, но что более важно, почему.

+0

rake db: test: подготовить – drhenner

+0

Я пробовал это раньше и получил команду «не найден» – Jadam

+0

Как насчет 'rake db: migrate', а затем' rake db: test: подготовить'? – jason328

ответ

4

Когда я удалил столбцы password и password_confirmation от пользователя, он прошел тест без ошибок. Мне рассказал друг, что, скорее всего, из-за обновления в разработке.

0

Я думаю, что здесь есть пара возможностей, но я сосредоточусь на ближайшей проблеме. Если ваши задачи Rake возвращаются No command found, возможно, это связано с тем, что Rake не установлен на вашем компьютере. Я бы начал там.

Чтобы установить Рейк, тип в вашем терминале:

gem install rake 

Причина, почему ваш код не работает, потому что ваша таблица пользователей не имеет столбец с именем password. С rake db:migrate и rake db:test:prepare вы гарантируете, что любые созданные вами миграции будут применены к вашей базе данных.

Дайте мне знать результаты.

+0

Это кажется странным, потому что я сделал rake db: перенесите кучу раз до этого без проблем. Есть ли команда, которую я могу запустить в консоль, чтобы узнать, установлена ​​ли она? Я попытался выполнить установку и получил следующую ошибку: ОШИБКА: при выполнении gem ... (Errno :: EACCES) Разрешение отказано - /Users/Jadam/.rvm/gems/ruby-2.0.0-p0/gems/ рейк-10.0.4 /.gemtest – Jadam

+0

Попробуйте 'bundle show' и посмотрите, будет ли рейк в списке, который будет отображаться. Но если вы запустили его, прежде чем вы его уже установили. Причина, по которой вы получили ошибку, состоит в том, что вы не ставили 'sudo' перед' gem install rake'. 'Sudo' позволяет запускать команды, когда вы не являетесь пользователем root. – jason328

+0

Показывает * рейк (10.0.4). Я совершенно уверен, что я пользователь root, так как я единственный на этом ноутбуке. – Jadam

0

Мне кажется, что проблема у вас есть, так же, как говорит ошибка, в таблице пользователя нет столбца с паролем. Вы должны добавить его к миграции:

t.string :password 

Заметим, однако, что я никогда не использовал Завещание, так что я может быть неправильно об этом.

+0

Devise установит для вас пароль. Следовательно, почему вы видите 'encrypted_password' в перемещениях. Разработать также достаточно хорошо, чтобы вы все еще использовали 'password' и' password_confirmation' в качестве атрибутов модели User. – jason328