技术开发 频道

DB2与Ruby on Rails入门


步骤 3:管理用户和他们对资源的访问

    组织或社区中的很多人都可能对这些文档感兴趣,所以需要有一种方式来管理那些用户和他们的访问。为此我们添加一个 USERS 表。另外还需要添加一个外键 'user_id' 到 DOCUMENTS 表中,以便知道哪个用户上传某个特定的文档。

    下面是执行这些任务所需的步骤:

a) 运行ruby script/generate migration create_users_table,这将创建 db/migrate/003_create_users_table.rb 文件

b) 像下面这样编辑 db/migrate/003_create_users_table.rb 文件:

清单 13. 编辑 003_create_users_table.rb
class CreateUsersTable < ActiveRecord::Migration
            def self.up
            create_table :users do |t|
            t.column :usertype,  :string, :limit => 5, :null => false
            t.column :firstname, :string, :limit => 30
            t.column :lastname,  :string, :limit => 30
            t.column :extension, :string, :limit => 4
            end
            add_column :documents, :user_id, :integer
            end
            def self.down
            drop_table :users
            remove_column :documents, :user_id
            end
            end

c) 运行rake db:migrate以创建 USERS 表:

清单 14. 通过迁移创建 USERS 表
D:\rails\teamroom>rake db:migrate
            (in D:/rails/teamroom)
            == CreateUsersTable: migrating ================================================
            -- create_table(:users)
            -> 0.1400s
            -- add_column(:documents, :user_id, :integer)
            -> 0.0000s
            == CreateUsersTable: migrated (0.1400s) =======================================


d) 现在可以发出ruby script/generate scaffold document,以便为 DOCUMENTS 表生成一个 scaffold。scaffolding 通过提供列出、显示、创建、更新和销毁类的对象的标准化动作,快速地使一个 Active Record 类上线。如下面的清单 15 所示,在 scaffold 生成期间,/app/controllers 和 /app/views 中创建了一个控制器和多个视图。

清单 15. 为文档创建 scaffold
D:\rails\teamroom>ruby script/generate scaffold document
            exists  app/controllers/
            exists  app/helpers/
            create  app/views/documents
            create  app/views/layouts/
            create  test/functional/
            dependency  model
            create    app/models/
            exists    test/unit/
            exists    test/fixtures/
            create    app/models/document.rb
            create    test/unit/document_test.rb
            create    test/fixtures/documents.yml
            create  app/views/documents/_form.rhtml
            create  app/views/documents/list.rhtml
            create  app/views/documents/show.rhtml
            create  app/views/documents/new.rhtml
            create  app/views/documents/edit.rhtml
            create  app/controllers/documents_controller.rb
            create  test/functional/documents_controller_test.rb
            create  app/helpers/documents_helper.rb
            create  app/views/layouts/documents.rhtml
            create  public/stylesheets/scaffold.css

    至此,可以看看 scaffold 可以做哪些事情。在命令提示符下,输入ruby script/server以启动用于 Rails 的内置 WEBrick Web 服务器:
清单 16. 启动内置的 WEBrick Web 服务器

D:\rails\teamroom>ruby script/server
            => Booting WEBrick...
            => Rails application started on http://0.0.0.0:3000
            => Ctrl-C to shutdown server; call with --help for options
            [2007-04-26 16:54:57] INFO  WEBrick 1.3.1
            [2007-04-26 16:54:57] INFO  ruby 1.8.5 (2006-12-25) [i386-mswin32]
            [2007-04-26 16:54:57] INFO  WEBrick::HTTPServer#start: pid=444 port=3000

    注意端口号。默认端口号为 3000,但是如果在系统上端口 3000 已经被占用,那么端口号可能有所不同。打开一个 Web 浏览器,进入http://localhost:3000/,您将注意到一条欢迎登录消息。浏览至 http://localhost:3000/documents,您将看到:

数据库模式图
图 1. 列出文档

e) 编辑生成的 /app/models/document.rb 文件,使之如下所示:
清单 17. 编辑 /app/models/document.rb

class Document < ActiveRecord::Base
            belongs_to :user
            end

    belongs_to 表达了 DOCUMENTS 与 USERS 表之间一对一的外键关系。这种关联表明,每个文档只能与一个用户关联(即只能属于一个用户)。如果 DOCUMENTS 表有一个user_id外键列,则文档模型为belongs_to :user

    我们在 /app/models/document.rb 中添加附加的代码,以便可以真正上传文档,并将文件存储在 DB2 9 数据库中。请参阅下载小节,以查看代码实现。在将很多文档添加到 Team Room 之后,在浏览器中可以看到如下所示的界面:

列出文档
图 2. 列出文档

 

f) 类似地,发出ruby script/generate scaffold user,以便为 Users 表生成一个 scaffold。然后编辑 /app/models/user.rb,使之如下所示:
清单 18. 编辑 /app/models/user.rb

class User < ActiveRecord::Base
            has_many :document
            end

    现在,您已经详细理解了前面几个迁移步骤,接下来我们执行剩下的迁移,以创建所需的其他表和关联。

0
相关文章