最近用Rails(版本为2.3.5,ruby版本为1.8.6),需要使用Session。考虑可伸缩性的问题,应该将Session存储在数据库中。我使用的数据库为MySQL 5.0。Rails默认的SessionStore为文件,因此需要修改config下environment.rb的设置,即设置为:

config.action_controller.session_store = :active_record_store

谁知道设置好session_store后,网页(我使用的浏览器为Firefox)竟然无法打开,显示如下:image我明白这是Session的问题,但检查了数据库中的Session表以及Rails中对Session的配置,都没有任何问题。通过检查日志,发现如下错误提示:

Status: 500 Internal Server Error
  Mysql::Error: Data too long for column 'session_id' at row 1:
INSERT INTO `sessions` (`updated_at`, `session_id`, `data`, `created_at`)
VALUES('2010-07-23 01:17:05', 'BAh7CDoPc2Vzc2lvbl9pZCIlMDNlNTg0ZDg2NjJkZmFjZT
diMjUwN2ExNmYyNGNjNjAiCmZsYXNoSUM6J0FjdG
lvbkNvbnRyb2xsZXI6OkZsYXNoOjpGbGFzaEhhc2h7A
AY6CkB1c2VkewA6EF9jc3JmX3Rva2VuIjFWNStxMUc
4bThmUmJHQ3VHRGQ3Q2RJR2p1aStUejdtRmRtc
0xJY1RIOUNrPQ==--6f29ea421cd0f14d5e8de7093
5515c26021c254f', 'BAh7AA==\n', '2010-07-23 01:17:05')

问题的症结显然并非配置的问题,而是插入的session_id太大。我检查了Sessions数据表的Column,发现其定义如下:

image 可是,我在enviroment.rb中,设置了Session的secret,如下:

config.action_controller.session = {
  :key => '_session',
  :secret      => 'f914e9b1bbdb829688de8512f5fea7d8e83fb35b
fe2b56bcf1e6438d1d1b7837c532f8c2ece2a2
d0e37812e9b210824089b1810a4e238a61dfd922dc9dd62521'
}

即使将secret设置为更短的值同样如此。

最后,我终于找到了答案,真是啼笑皆非。很简单的办法,那就是清除掉浏览器中Cookie的值。一切Ok。现在,查看sessions表,则session_id的值为:

image

session_id的长度变得正常了。系统同样恢复正常。这真的是一个容易忽视的陷阱。留此存照!