Fixing this Error: NameError (uninitialized constant ActiveRecord::ConnectionAdapters::Mysql2Adapter::Column)
Fixing this Error: NameError (uninitialized constant ActiveRecord::ConnectionAdapters::Mysql2Adapter::Column)
有两个应用程序。其中一个应用程序正在使用 rails 4.1.2。另一个应用程序正在使用 rails 5.0.1。以下是 rails 5 应用程序的工作原理:它检查用户是否已登录:
- 如果用户已登录:那么用户应该能够继续前进。
- 如果用户 NOT 登录,则将他们重定向到 rails 4 应用程序(这是用户可以登录的地方)。一旦用户使用 rails 4 应用程序登录:用户应该能够毫无问题地访问 rails 5 应用程序。
我目前在我的 Rails 5 项目中使用以下 gem:
gem 'mysql2', '~> 0.4.4'
gem 'activerecord-session_store', '~> 1.0'
然后我的 config/initializers/session_store.rb
文件中有以下内容:
Rails.application.config.session_store :active_record_store, :key => ‘SOME_KEY’
目前:如果用户没有登录:那么它会成功重定向用户。问题是当用户 是 登录时。当登录用户尝试访问 rails 5 应用程序时出现此错误:
NameError (uninitialized constant ActiveRecord::ConnectionAdapters::Mysql2Adapter::Column)
- 我确实注意到该应用已成功连接到数据库
- 该应用似乎还应初始请求(当用户未登录时)访问
sessions
table。
关于是什么触发了这个错误以及如何修复它有什么建议吗?最终:看起来 rails 5
似乎与 activerecord-session_store
和 mysql2
不兼容。
我们最终弄明白了。
Marshal
模块可以序列化ruby对象到数据库。它还可以反序列化数据库中的内容以重新创建对象。
当您序列化一个对象时,其中似乎也包含一些低级信息,例如 mysql2 连接适配器。
当 Rails 5 应用程序尝试 反序列化 数据时,它会抛出此错误,因为 MySql2 连接适配器中存在的常量 Rails 4 在该适配器的 Rails 5 版本中不存在。
我们的解决方法是不为我们的 rails 5 应用存储或检索来自会话 table 的任何序列化对象。成功了。
如果我们真的需要从我们的 rails 5 应用程序的会话 table 中检索序列化对象:那么我认为我们必须想出一个自定义解决方案。
希望这对以后的其他人有所帮助!
这可能是由于版本的变化,即 Rails 5.0.
如 Ruby on Rails 5.0 Release Notes:
从核心中删除了对遗留 mysql 数据库适配器的支持。大多数用户应该能够使用 mysql2。找人维护的时候会转成单独的gem
已弃用向#tables 传递参数 - 某些适配器(mysql2、sqlite3)的#tables 方法会 return 表和视图,而其他(postgresql)只是 return表。为了使它们的行为保持一致,#tables 将 return 将来只使用表格。
您在回答中描述的常量差异可能是由于它们将针对 mysql2 适配器更改 gem。
有两个应用程序。其中一个应用程序正在使用 rails 4.1.2。另一个应用程序正在使用 rails 5.0.1。以下是 rails 5 应用程序的工作原理:它检查用户是否已登录:
- 如果用户已登录:那么用户应该能够继续前进。
- 如果用户 NOT 登录,则将他们重定向到 rails 4 应用程序(这是用户可以登录的地方)。一旦用户使用 rails 4 应用程序登录:用户应该能够毫无问题地访问 rails 5 应用程序。
我目前在我的 Rails 5 项目中使用以下 gem:
gem 'mysql2', '~> 0.4.4'
gem 'activerecord-session_store', '~> 1.0'
然后我的 config/initializers/session_store.rb
文件中有以下内容:
Rails.application.config.session_store :active_record_store, :key => ‘SOME_KEY’
目前:如果用户没有登录:那么它会成功重定向用户。问题是当用户 是 登录时。当登录用户尝试访问 rails 5 应用程序时出现此错误:
NameError (uninitialized constant ActiveRecord::ConnectionAdapters::Mysql2Adapter::Column)
- 我确实注意到该应用已成功连接到数据库
- 该应用似乎还应初始请求(当用户未登录时)访问
sessions
table。
关于是什么触发了这个错误以及如何修复它有什么建议吗?最终:看起来 rails 5
似乎与 activerecord-session_store
和 mysql2
不兼容。
我们最终弄明白了。
Marshal
模块可以序列化ruby对象到数据库。它还可以反序列化数据库中的内容以重新创建对象。
当您序列化一个对象时,其中似乎也包含一些低级信息,例如 mysql2 连接适配器。
当 Rails 5 应用程序尝试 反序列化 数据时,它会抛出此错误,因为 MySql2 连接适配器中存在的常量 Rails 4 在该适配器的 Rails 5 版本中不存在。
我们的解决方法是不为我们的 rails 5 应用存储或检索来自会话 table 的任何序列化对象。成功了。
如果我们真的需要从我们的 rails 5 应用程序的会话 table 中检索序列化对象:那么我认为我们必须想出一个自定义解决方案。
希望这对以后的其他人有所帮助!
这可能是由于版本的变化,即 Rails 5.0.
如 Ruby on Rails 5.0 Release Notes:
从核心中删除了对遗留 mysql 数据库适配器的支持。大多数用户应该能够使用 mysql2。找人维护的时候会转成单独的gem
已弃用向#tables 传递参数 - 某些适配器(mysql2、sqlite3)的#tables 方法会 return 表和视图,而其他(postgresql)只是 return表。为了使它们的行为保持一致,#tables 将 return 将来只使用表格。
您在回答中描述的常量差异可能是由于它们将针对 mysql2 适配器更改 gem。