web-dev-qa-db-ja.com

#<ActiveRecord :: ConnectionAdapters :: TableDefinition:0x9dee690>の未定義のメソッド `database_authenticatable '

クイズに基づく小さなアプリケーションにActiveAdmingemを使用しています。しかし、rake db:migrateを実行すると、エラーが発生します。以下は、コマンドのトレースです。

$ rake db:migrate Rails_ENV=production --trace
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke db:load_config (first_time)
** Invoke Rails_env (first_time)
** Execute Rails_env
** Execute db:load_config
** Execute db:migrate
==  DeviseCreateAdminUsers: migrating =========================================
-- create_table(:admin_users)
rake aborted!
An error has occurred, all later migrations canceled:

undefined method `database_authenticatable' for #<ActiveRecord::ConnectionAdapters::TableDefinition:0x9dee690>
/home/users/Documents/Quiz/db/migrate/20120509055635_devise_create_admin_users.rb:4:in `block in change'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/schema_statements.rb:160:in `create_table'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/connection_adapters  /abstract_mysql_adapter.rb:432:in `create_table'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/migration.rb:466:in `block in method_missing'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/migration.rb:438:in `block in say_with_time'
/home/users/.rvm/rubies/Ruby-1.9.2-p318/lib/Ruby/1.9.1/benchmark.rb:295:in `measure'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/migration.rb:438:in `say_with_time'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/migration.rb:458:in `method_missing'
/home/users/Documents/Quiz/db/migrate/20120509055635_devise_create_admin_users.rb:3:in `change'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/migration.rb:407:in `block (2 levels) in migrate'
/home/users/.rvm/rubies/Ruby-1.9.2-p318/lib/Ruby/1.9.1/benchmark.rb:295:in `measure'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/migration.rb:407:in `block in migrate'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:119:in `with_connection'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/migration.rb:389:in `migrate'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/migration.rb:528:in `migrate'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/migration.rb:720:in `block (2 levels) in migrate'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/migration.rb:777:in `call'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/migration.rb:777:in `ddl_transaction'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/migration.rb:719:in `block in migrate'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/migration.rb:700:in `each'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/migration.rb:700:in `migrate'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/migration.rb:570:in `up'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/migration.rb:551:in `migrate'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/activerecord-3.2.3/lib/active_record/railties/databases.rake:153:in `block (2 levels) in <top (required)>'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `call'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `block in execute'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `each'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `execute'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/rake-0.9.2.2/lib/rake/task.rb:158:in `block in invoke_with_call_chain'
/home/users/.rvm/rubies/Ruby-1.9.2-p318/lib/Ruby/1.9.1/monitor.rb:201:in `mon_synchronize'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/rake-0.9.2.2/lib/rake/task.rb:151:in `invoke_with_call_chain'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/rake-0.9.2.2/lib/rake/task.rb:144:in `invoke'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/rake-0.9.2.2/lib/rake/application.rb:116:in `invoke_task'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `block (2 levels) in top_level'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `each'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `block in top_level'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/rake-0.9.2.2/lib/rake/application.rb:88:in `top_level'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/rake-0.9.2.2/lib/rake/application.rb:66:in `block in run'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/rake-0.9.2.2/lib/rake/application.rb:63:in `run'
/home/users/.rvm/gems/Ruby-1.9.2-p318/gems/rake-0.9.2.2/bin/rake:33:in `<top (required)>'
/home/users/.rvm/gems/Ruby-1.9.2-p318/bin/rake:19:in `load'
/home/users/.rvm/gems/Ruby-1.9.2-p318/bin/rake:19:in `<main>'
Tasks: TOP => db:migrate

Follwoingは私のGemFileです:

source 'https://rubygems.org'

gem 'Rails', '3.2.3'

# Bundle Edge Rails instead:
# gem 'Rails', :git => 'git://github.com/Rails/rails.git'

gem 'mysql2'
gem 'devise'
gem 'activeadmin', :git => 'https://github.com/gregbell/active_admin.git'
gem 'therubyracer'
gem 'formtastic'
gem 'haml'
gem 'Paperclip'

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-Rails',   '~> 3.2.3'
  gem 'coffee-Rails', '~> 3.2.1'

  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
  # gem 'therubyracer', :platform => :Ruby

  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-Rails'

20120509055635_devise_create_admin_users.rbのコンテンツは

class DeviseCreateAdminUsers < ActiveRecord::Migration
  def change
    create_table(:admin_users) do |t|
      t.database_authenticatable :null => false
      t.recoverable
      t.rememberable
      t.trackable

      # t.encryptable
      # t.confirmable
      # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
      # t.token_authenticatable


      t.timestamps
    end

    # Create a default user
    AdminUser.create!(:email => '[email protected]', :password => 'password', :password_confirmation => 'password')

    add_index :admin_users, :email,                :unique => true
    add_index :admin_users, :reset_password_token, :unique => true
    # add_index :admin_users, :confirmation_token,   :unique => true
    # add_index :admin_users, :unlock_token,         :unique => true
    # add_index :admin_users, :authentication_token, :unique => true
  end

end

上記の問題を検索して this を取得しましたが、これは役に立ちませんでした。どこでも私はこの解決策だけを見つけました。以前にこの問題に遭遇した人はいますか?はいの場合、それに取り組むために何をしましたか?これに関するどんな助けもいただければ幸いです。ありがとう

25
lucifer

同じ問題だと思うものがあり、gemを更新し、dbを削除しました。その後、非常によく似たメッセージが表示され、比較するために新しいRailsアプリを作成しました。移行ファイルが変更され、メソッドを呼び出す代わりに列が含まれるようになりました。

お役に立てば幸いです。

乾杯!

8
Roberto Ruiz

また、新しいステージングサーバーにデプロイしようとしたときに、既存のアプリでこの問題が発生しました。

結局、Devise gemが2.1に更新され、新しいバージョンで正しく機能するように移行を修正していませんでした。

Wikiの2.1ドキュメントへの移行を必ずお読みください-- https://github.com/plataformatec/devise/wiki/How-To:-Upgrade-to-Devise-2.1

また、既存の移行を正しく調整する方法については、ドキュメントを必ずお読みください-- https://github.com/plataformatec/devise/wiki/How-To:-Upgrade-to-Devise-2.0-migration -スキーマスタイル

43

私はこれに2回遭遇しましたが、本当に簡単な解決策があります-データベースの移行の代わりに、これを実行します:

heroku run rake db:create 
# optionally with --app your_apps_name if you have multiple apps.

その後:

rake db:schema:load
13
Michael Durrant

問題は、Devise2.0移行スキーマスタイルの変更の結果である可能性があると思います。以下のリンクで新しいスキーマ形式を確認してください。それに応じて移行を更新し、再試行してください。これは特に#herokuでうまくいきました

https://github.com/plataformatec/devise/wiki/How-To:-Upgrade-to-Devise-2.0-migration-schema-style

3
John Kamuchau

私の担当者からわかるように、このサイトは初めてです。 John Kamuchauは正しいです。バージョンに応じて、xxx​​x_devise_create_users.rbの移行を変更する必要があります。

たとえば、私はRails 3.2から4.2の更新デバイスをそれに応じて更新し、非推奨のものを変更する必要がありました-

t.database_authenticatable :null => false

ために -

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

古い質問ですが、誰かが探しに来た場合にこれが役立つことを願っています。

2
Benjo