问题 修复此错误:NameError(未初始化的常量ActiveRecord :: ConnectionAdapters :: Mysql2Adapter :: Column)


有两个应用程序。其中一个应用程序使用rails 4.1.2。另一个应用程序正在使用rails 5.0.1。以下是rails 5 app的工作原理:它检查用户是否已登录:

  • 如果用户已登录:则用户应该能够继续前进。
  • 如果是用户  登录后,它会将它们重定向到rails 4 app(用户可以登录的位置)。一旦用户使用rails 4 app登录:用户应该能够访问rails 5 app没问题。

我目前在我的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 app时出现此错误:

NameError (uninitialized constant ActiveRecord::ConnectionAdapters::Mysql2Adapter::Column)
  • 我注意到该应用程序已成功连接到数据库
  • 该应用程序似乎也可以访问 sessions 初始请求时的表(当用户未登录时)。

有关触发此错误的内容以及如何解决此问题的任何建议?最终:它几乎看起来好像 rails 5 与...不相容 activerecord-session_store 和 mysql2


6041
2018-02-17 20:15


起源

错误之前或之后的行中必须有更多关于它来源的信息。 - Iceman
@Iceman不幸的是:只有堆栈跟踪。这是最后一行: activesupport (5.0.1) lib/active_support/inflector/methods.rb:270:in const_get'` - Neil
仔细看看它,必须有一些代码,你要求登录用户产生这个错误。 - Iceman


答案:


我们终于能够弄清楚了。

Marshal 模块可以 连载 ruby对象到数据库。它也可以 反序列化 数据库中的东西,以便重新创建对象。

当你序列化一个对象时,似乎还有一些低级别的信息,比如mysql2连接适配器。

当Rails 5应用程序尝试时 反序列化 数据,它会抛出此错误,因为Rails 4的MySql2连接适配器中存在的常量在该适配器的Rails 5版本中不存在。

我们的工作是不要在rails 5应用程序的会话表中存储或检索任何序列化对象。这就是诀窍。

如果我们确实需要从rails 5应用程序的会话表中检索序列化对象:那么我认为我们必须提出自定义解决方案。

希望这有助于将来的其他人!


6
2018-02-21 21:54





这可能是由于版本的变化,即Rails 5.0。

如在 Ruby on Rails 5.0发行说明

从核心删除了对旧版mysql数据库适配器的支持。大多数用户应该能够使用mysql2。当我们发现有人维护它时,它将被转换为一个单独的宝石。

不推荐将传递参数传递给#tables - 某些适配器的#tables方法(mysql2,sqlite3)将返回表和视图,而其他(postgresql)只返回表。为了使它们的行为保持一致,#tables将来只返回表。

您在答案中描述的常量差异可能是由于他们要为mysql2适配器更改gem。


4
2018-03-01 07:03