有两个应用程序。其中一个应用程序使用rails 4.1.2。另一个应用程序正在使用rails 5.0.1。以下是rails 5 app的工作原理:它检查用户是否已登录:
我目前在Rails 5项目中使用以下宝石:
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
不兼容。
答案 0 :(得分:6)
我们最终能够弄明白。
Marshal
模块可以序列化 ruby对象到数据库。它还可以从数据库中反序列化内容,以便重新创建对象。
当你序列化一个对象时,似乎还有一些低级别的信息,比如mysql2连接适配器。
当Rails 5应用程序尝试反序列化数据时,它会抛出此错误,因为Rails 5的Rails 5版本中不存在Rails 4的MySql2连接适配器中存在的常量。
我们的工作就是不要在rails 5应用程序的会话表中存储或检索任何序列化对象。这就是诀窍。
如果我们确实需要从rails 5应用程序的会话表中检索序列化对象:那么我认为我们必须提出自定义解决方案。
希望这有助于将来的其他人!
答案 1 :(得分:4)
这可能是由于版本的变化,即Rails 5.0。
在Ruby on Rails 5.0 Release Notes中:
从核心删除对旧版mysql数据库适配器的支持。大多数用户应该能够使用mysql2。当我们找到某人维护它时,它将被转换为一个单独的宝石。
不推荐将传递参数传递给#tables - 某些适配器的#tables方法(mysql2,sqlite3)将返回表和视图,而其他(postgresql)只返回表。为了使它们的行为保持一致,#tables将来只返回表。
你在答案中描述的常量差异可能是因为他们要为mysql2适配器更改gem。