我对 Rails 比较陌生 - 我已经编写了 4 个月的代码 - 我正在为 Apple 推送通知安装 rapns gem 到 Rails 应用程序中,作为 iOS 应用程序的后端服务器.
我正在使用 ruby 1.9.3p327、rails 3.2.13 和 rapns 3.3.1。
我从这些说明中成功运行了“rails g rapns”,然后当我运行“rake db:migrate”时,当 rails 尝试运行 add_gcm 迁移文件时,出现以下错误:
== AddGcm: migrating =========================================================
-- add_column(:rapns_notifications, :type, :string, {:null=>true})
-> 0.0385s
-- add_column(:rapns_apps, :type, :string, {:null=>true})
-> 0.0247s
-- change_column(:rapns_notifications, :type, :string, {:null=>false})
-> 0.0456s
-- change_column(:rapns_apps, :type, :string, {:null=>false})
-> 0.0222s
-- change_column(:rapns_notifications, :device_token, :string, {:null=>true, :limit=>64})
-> 0.0372s
-- change_column(:rapns_notifications, :expiry, :integer, {:null=>true, :default=>86400})
-> 0.0319s
-- change_column(:rapns_apps, :environment, :string, {:null=>true})
-> 0.0213s
-- change_column(:rapns_apps, :certificate, :text)
rake aborted!
An error has occurred, all later migrations canceled:
Mysql2::Error: BLOB/TEXT column 'certificate' can't have a default value: ALTER TABLE `rapns_apps` CHANGE `certificate` `certificate` text DEFAULT '' NOT NULL/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in `query'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in `block in execute'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activesupport-3.2.13/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in `execute'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/connection_adapters/mysql2_adapter.rb:211:in `execute'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:480:in `change_column'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:466:in `block in method_missing'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:438:in `block in say_with_time'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:438:in `say_with_time'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:458:in `method_missing'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:334:in `method_missing'
/Users/Greg/Camboo-Server/db/migrate/20130620184555_add_gcm.rb:25:in `up'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:370:in `up'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:410:in `block (2 levels) in migrate'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:410:in `block in migrate'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_pool.rb:129:in `with_connection'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:389:in `migrate'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:528:in `migrate'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:720:in `block (2 levels) in migrate'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:777:in `call'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:777:in `ddl_transaction'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:719:in `block in migrate'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:700:in `each'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:700:in `migrate'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:570:in `up'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/migration.rb:551:in `migrate'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/activerecord-3.2.13/lib/active_record/railties/databases.rake:193:in `block (2 levels) in <top (required)>'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/rake-10.0.4/lib/rake/task.rb:246:in `call'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/rake-10.0.4/lib/rake/task.rb:246:in `block in execute'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/rake-10.0.4/lib/rake/task.rb:241:in `each'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/rake-10.0.4/lib/rake/task.rb:241:in `execute'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/rake-10.0.4/lib/rake/task.rb:184:in `block in invoke_with_call_chain'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/rake-10.0.4/lib/rake/task.rb:177:in `invoke_with_call_chain'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/rake-10.0.4/lib/rake/task.rb:170:in `invoke'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/rake-10.0.4/lib/rake/application.rb:143:in `invoke_task'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/rake-10.0.4/lib/rake/application.rb:101:in `block (2 levels) in top_level'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/rake-10.0.4/lib/rake/application.rb:101:in `each'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/rake-10.0.4/lib/rake/application.rb:101:in `block in top_level'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/rake-10.0.4/lib/rake/application.rb:110:in `run_with_threads'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/rake-10.0.4/lib/rake/application.rb:95:in `top_level'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/rake-10.0.4/lib/rake/application.rb:73:in `block in run'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/rake-10.0.4/lib/rake/application.rb:160:in `standard_exception_handling'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/gems/rake-10.0.4/lib/rake/application.rb:70:in `run'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/bin/ruby_noexec_wrapper:14:in `eval'
/Users/Greg/.rvm/gems/ruby-1.9.3-p327/bin/ruby_noexec_wrapper:14:in `<main>'
这是我尝试过的:
- 我从迁移文件的上下部分删除了 ":null => true"。当我现在运行“rake db:migrate”时,我收到了这个错误:(
Mysql2::Error: Duplicate column name 'type': ALTER TABLE rapns_notifications ADD type
如果需要,我可以提供跟踪)。基于这个Github issue。 - 一旦成功,我注释掉了`add_column :rapns_notifications, :type, :string, :null => true
add_column :rapns_apps, :type, :string, :null => true` 因为两者都给了我“重复列”错误。松散地基于this SO answer
执行上述步骤后,我使迁移成功工作。我将继续前进,看看是否可以在没有这些列和 :certificate 的默认值的情况下安装 Rapns
任何想法我做错了什么?这是我不理解的迁移和回滚问题吗?也许是我无法解决的 Mysql2 错误。或者完全是别的东西。
我将在继续前进时编辑我的问题。
谢谢你的帮助,SO'ers!你们真棒。
编辑(6/20 15:44):我尝试通过 rails 控制台创建一个新的 Rapns 应用程序,发现 add_gcm 迁移文件没有完全迁移。在我的架构中,rapns_app 仍然有一个 :key 属性,在 rapns 3.x 中该属性已更改为 :name 以支持 gcm。所以,没有 :name 我无法创建 apns_app。为什么迁移文件运行不正常?
编辑(6/24):显然这是 rapns 的错误。与维护者合作解决问题。谢谢。