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

单例资源

上一章中,通过了 blog_entries 控制台的功能测试。

这章来看一下 account 控制台。

> ruby -Itest test/functional/account_controller_test.rb
Loaded suite test/functional/account_controller_test
Started
FF....
Finished in 0.262014 seconds.

  1) Failure:
test_edit1(AccountControllerTest)
    [/usr/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/assertions/selector_assertions.rb:297:in `assert_select'
     test/functional/account_controller_test.rb:49:in `test_edit1'
     /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/testing/setup_and_teardown.rb:60:in `__send__'
     /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/testing/setup_and_teardown.rb:60:in `run']:
Expected at least 1 element matching "form[action='/account']", found 0.
<false> is not true.

  2) Failure:
test_routing(AccountControllerTest)
    [test/functional/account_controller_test.rb:18:in `test_routing'
     /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/testing/setup_and_teardown.rb:60:in `__send__'
     /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/testing/setup_and_teardown.rb:60:in `run']:
The generated path <"/account/show"> did not match <"/account">

6 tests, 17 assertions, 2 failures, 0 errors

这次好像与分页没有关系。

从测试方法 test_routing 开始看吧。失败出现在下面这个地方。

    assert_generates '/account',
      { :controller => 'account', :action => 'show' }

这是由于从 Rails2.0 开始,单例资源的控制台名称从单数型变成了复数型。
对应 account 资源的控制台不是 account_controller.rb ,变成了 accounts_controller.rb 。因此,路由混乱了。

所谓单例资源

在某文本中存在的, Web 程序里唯一的一个资源。

例如,“帐户”这个资源虽然存在复数,但是在某个用户登录的情况下,“我的帐户”这个资源只存在一个。

Rails 中,通过 /accounts 这个 URL 路径表示“帐户列表”,由 /accounts/99 表示“id 是 99 的帐户”,/account 表示“我的帐户”。

Rails 1.2 时代,还需要分别为普通资源和单例资源配置不同的控制台,Rails 2.0 以后就可以使用相同的控制台来处理了。

按照下面的顺序测试便通过了。

  • /app/controllers/account_controller.rb 的文件名变为 accounts_controller.rb
  • 打开 accounts_controller.rb ,把类名从 AccountController 变成 AccountsController
  • /app/views/account 的目录名称变为 accounts
  • /test/functional/account_controller_test.rb 的文件名变成 accounts_controller_test.rb
  • 打开accounts_controller_test.rb ,做如下修改。
    • 删除第2-5行。
    • 把类名从 AccountControllerTest 变为 AccountsControllerTest
    • setup 方法中使用的 AccountController 变成 AccountsController
    • test_routing 方法做如下改正。
  def test_routing
    assert_generates '/account',
      { :controller => 'accounts', :action => 'show' }
    assert_generates '/account/edit',
      { :controller => 'accounts', :action => 'edit' }
    assert_generates '/account',
      { :controller => 'accounts', :action => 'update' }
  end

如果执行 test:functionals 任务的话……

92 tests, 315 assertions, 0 failures, 4 errors

失败从 2 减到 0 。剩下的只是 4 个错误。今天就讲到这吧。

(2008/12/21)