首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 ActiveScaffold 增强 Ruby on Rails 的功能(1)

使用 ActiveScaffold 增强 Ruby on Rails 的功能(1)

为复杂应用程序编写基于 Web 的数据输入 UI 永远都不是件快乐的事,通常都是非常单调乏味的。良好用户界面的一个关键属性是一致性,但是这需要一个博学勤勉的开发团队才能设计符合这种设计标准的 Web 页面。与其他 Web 应用程序框架类似,Ruby on Rails 也有相同的问题。不过,Ruby 语言的动态特性提供了一个解决方案:ActiveScaffold。ActiveScaffold 是 Ruby on Rails (也称为 Rails)的一个插件,它可以动态地生成基于模型的视图。ActiveScaffold 不需要手工创建页面来显示模型,而是可以从内部审视 ActiveRecord 模型,并动态地生成一个 CRUD(创建、读取、更新、删除)用户界面来管理这些对象。
本文是基于 ActiveScaffold、Ruby 和 Rails 的当前(撰写本文之时)可用的最新版本来撰写的(链接和版本号请参看 )。另外,本文假设您非常熟悉 Ruby on Rails,并且正在使用 Linux® 或 Mac OS X 系统。Windows® 用户应该修改本文中给出的命令来适合自己的环境(例如,将 ‘ruby’ 添加到脚本命令最前面)。
安装 ActiveScaffold 由于 ActiveScaffold 是一个 Rails 插件,可以从一个远程 Web 或者         Subversion 服务器上安装。下面的命令将从         ActiveScaffold Subversion 服务器中获取 ActiveScaffold。
清单 1. 安装 ActiveScaffold 插件
1
script/plugin install http://activescaffold.googlecode.com/svn/tags/active_scaffold




注意这将获取 ActiveScaffold 的当前发行版(即最新发行版)。撰写本文时使用的是 1.0 发行版,但是也可以使用将来的发行版:ActiveScaffold 开发人员迄今为止一直很好地关注着兼容性问题。
模型最现代的 Web 应用程序框架都基于 MVC(模型、视图、控制器)模式,Rails 也不例外。模型表示数据库中存储的数据,每个表在 Ruby 中都有一个对应的         ActiveRecord 模型类。在本文中,我们创建了一个简单的项目跟踪应用程序,其中,组织拥有很多用户和很多项目。下面的代码显示了 ActiveRecord 向应用程序和对应模型类上迁移的过程。注意模型类要比 Java 中相同的类简单很多。这是 Rails 的 DRY(不要重复自己)原则的基本例子。由于迁移早已包含了列,为什么还要在模型类中再次将它们列出来呢?
清单 2. 迁移
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class AddOrganizations < ActiveRecord::Migration
  def self.up
    create_table rganizations do |t|
      t.column :name, :string, :limit => 50, :null => false
    end
  end

  def self.down
    drop_table rganizations
  end
end

class AddUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.column :first_name, :string, :limit => 50, :null => false
      t.column :last_name, :string, :limit => 50, :null => false
      t.column :email, :string, :limit => 100, :null => false
      t.column :password_hash, :string, :limit => 64, :null => false
      t.column rganization_id, :integer, :null => false
    end
    add_index :users, :email, :unique => true
  end

  def self.down
    drop_table :users
  end
end

class AddProjects < ActiveRecord::Migration
  def self.up
    create_table :projects do |t|
      t.column :name, :string, :limit => 50, :null => false
      t.column rganization_id, :integer, :null => false
    end
  end

  def self.down
    drop_table :projects
  end
end

class AddProjectsUsers < ActiveRecord::Migration
  def self.up
    create_table :projects_users do |t|
      t.column :project_id, :integer, :null => false
      t.column :user_id, :integer, :null => false
      t.column :role_type, :integer, :null => false
    end
  end

  def self.down
    drop_table :projects_users
  end
end




清单 3. 模型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class User < ActiveRecord::Base
   belongs_to rganization
end
class Organization < ActiveRecord::Base
  has_many :projects
  has_many :users
end
class Project < ActiveRecord::Base
  belongs_to rganization
  has_many :projects_users
  has_many :administrators, :through => :projects_users, :source => :user,
           :conditions => "projects_users.role_type = 3"
  has_many :managers, :through => :projects_users, :source => :user,
           :conditions => "projects_users.role_type = 2"
  has_many :workers, :through => :projects_users, :source => :user,
           :conditions => "projects_users.role_type = 1"
end
class ProjectsUser < ActiveRecord::Base
  belongs_to :project
  belongs_to :user
end




插件和生成器的对比Ruby on Rails 可以支持两种 “开发助手”。生成器 是静态的 — 它们只会在生成代码时运行一次。插件 是动态的 — 它们可以作为应用程序运行时的一部分运行。例如,标准的 Rails scaffold 生成器就是运行一次来基于模型中的当前字段创建一个静态 HTML 模板。如果希望添加一列,就必须重新生成视图(丢失所做的更改),或者将字段手工添加到视图中。这将给模型更改增加不必要的复杂性。
插件会在运行时生成这些视图,因此更改模型就不困难了。与生成器相比,插件并没有什么实际的劣势,但是可能会比使用生成器稍微复杂一点。

User、Organization 和 Project 表都代表域中的传统实体,而 ProjectsUsers 表则会在 Project 和 User 实体之间增加一个多对多的关系。在本例中,它会添加一个         role_type 属性,它代表用户在项目中所扮演的角色。用户可能是工人、经理和/或管理员。
在模型上创建任何用户界面所需要的关键信息都是要理解模型之间的关系。通过在模型中声明        has_many 和 belongs_to,就在它们之间定义了一种特定类型的关系。一旦         ActiveScaffold 知道了这些关系,就可以提供一个用户界面以一种用户可以理解的方式对这些对象进行操作。在这种情况下,ActiveScaffold 就可以确定某个 Project 是由某个 Organization 所有的,因此可以相应地调整用户界面。如果您更改了这种关系,则用户界面就可以相应地变化,无需开发人员更改 UI。
边注:由于 Rails 迁移框架中存在某种限制,使清单 2 中的迁移无法使用外键。为了确保数据一致性,强烈推荐使用这些外键。Redhill Consulting 提供了一个很好的 foreign_key_migrations 插件,它增加了在 Rail 数据库迁移框架中对外键的支持;有关更多信息,请参看  中的链接。
返回列表