icon 《基础 Ruby on Rails》的示例程序asagao与Rails2.2相适应

Cookie Store

上一章讲到rake db:initialize 发生错误时结束了。

错误信息中出现了

undefined method `cache_template_extensions=' for ActionView::Base:Class

把这个放到google上搜索,答案显示在http://whatdoesthiserrormean.com/errors/1264

好像把以 config.action_view.cache_template_extensions= 打头的行从 config/environments.development.rb 删除就可以了。

      *******************************************************************
      * config.breakpoint_server has been deprecated and has no effect. *
      *******************************************************************

又因为也出现了像这样的警告,顺便把 config.breakpoint_server = true 一行也删掉吧。

再次执行 rake db:initialize ,就没问题了


接下来,试着启动 Web 服务器。

启动时没有出现错误。

但是,试着显示首页的话……

Status: 500 Internal Server Error
A secret is required to generate an integrity hash for cookie session data.
Use config.action_controller.session = { :session_key => "_myapp_session",
:secret => "some secret phrase of at least 30 characters" } in config/environment.rb

像这样的错误便出现了。

嗯,这便关系到在 rails 2.1 登场的Cookie Store

所谓Cookie Store

它是将会话数据存储进cookie的会话管理方式。

传统的会话管理方式中,会话数据被存储进服务器端(文件,数据库,缓存系统等),只有会话ID被存入 Cookie。

Cookie Store与其他方式相比,可以减少服务器端的负荷。

Cookie 中的数据有 4KB 的大小限制,但是 rails 应用程序通常在会话中只存储用户 ID 和闪存信息,因此没什么问题。

然而,因为将数据的散列值也存储在 Cookie 中,用户不能变更会话数据(可以读取)。

照错误信息所写,在 config/environment.rb 后追加如下语句。

  config.action_controller.session = {
    :session_key => "_asagao_session",
    :secret => "d037a8c060089047375b82d9df5e732e"
  }

追加的位置在

Rails::Initializer.run do |config|
  ...
end

的内部。

虽然在 :secret 选项可以存储任何值,但是最好是 30 字以上的随机字符串。

执行 ruby script/console 启动 Rails 控制台,如果执行 ActiveSupport::SecureRandom.hex(64) 的话,rails 将以生成应用程序的同样的方法生成随机字符串。

使用 CTRL+C 关闭 Web 服务器,再重新启动。刷新首页,没有显示出问题。

那今天就到这儿吧。

(2008/12/16)