posts - 262,  comments - 221,  trackbacks - 0

也许是使用Java久了,觉得每个程序都应该这么复杂繁琐,所以当第一次使用RoR在5分钟内完成一个带验证的CRUD页面后,我彻底地迷上了Rails了,原来写程序可以这样简单而充满乐趣啊!

总结一下这个简单的过程:

①下载InstantRails并解压

RoR推荐的运行环境是Linux/Unix环境,但在Linux/Unix下的安装配置比较麻烦(可以参加JavaEye上Robbin写的文章),在这里以Windows为例,InstantRails是一个Windows下RoR的集成运行环境,目前最新的版本是2.0。它内部集成了运行RoR的所有必须配置,包括:ruby 1.8.6、Rails 2.0.2、gem 1.0.1,甚至还内置了Apache, Mongrel服务器以及MySQL服务器。

当然你可以说这种集成配置不能满足生产环境下高性能的要求,那么你可以参考Robbin下的另一篇Windows下配置RoR环境的文章,不过这篇文章中的版本已经过低,而且有些地方(负载均衡)省略了几个步骤,所以必须结合Apache的文档进行配置才能成功。

如果你只是想尽快体验RoR的魔力,那么到RubyForge上下在这个InstantRails已经足够。下载后解压就可以立刻运行了。这里有一个需要注意的地方:

“由于InstantRails是一个自包含环境,也就是说它有自己独立的,隔绝的运行时环境,所以你需要执行任何RoR的命令行操作,都必须通过菜单I(就是左上角那个倾斜的I图标--->Rails Applications ---> Open Ruby console window)进行,通过这个方式打开的命令行窗口,默认加载了RoR运行的所有组件,如果你是通过普通的Windows开始菜单--->运行命令打开的,则可能会出现类似这样的错误:ruby, rails, rake不是可识别或运行的命令”

②创建项目的目录结构

和J2EE Servlet规范一样,RoR同样有固定的目录结构,通常目录结构如下:



●app:用来存放models,controllers,views,helper代码的(MVC模型)
●config:用来存放应用的配置,最重要的就是database.yml文件
●db:用来存放数据库文件的,RoR内置了Sqlite数据库,一个数据库就是一个.sqlite3文件
●public:这个是用来存放css,js,image的地方,页面的所有CSS,JS,图片链接都相对于这个目录
●script:功能无比强大的目录,里面有代码生成,启动服务器,下载并安装插件的命令
●vendor:用来存放第三方插件的目录

好,讲了这么多那么如何自动生成这个目录结构呢?只需要在在Ruby运行时console窗口输入一条命令: 

rails depot


一切搞定!depot就是我们项目的名称,剩下的事情由rails命令去做

③创建数据库并测试连接

很简单是吧!下面我们开始创建一个数据库,由于Rails默认内置了Sqlite数据库(当然也支持其它数据库),所以我们采用最简单的方式(但不代表性能或功能就差!)。我们打开上面提到的config目录下的database.yml文件。见到如下内容:

D:\Workspace\RoR\depot>type config\database.yml
# SQLite version 3.x
#
   gem install sqlite3-ruby (not necessary on OS X Leopard)
development:
  adapter: sqlite3
  database: db
/development.sqlite3
  timeout: 
5000

# Warning: The database defined as 'test' will be erased and
#
 re-generated from your development database when you run 'rake'.
#
 Do not set this db to the same as development or production.
test:
  adapter: sqlite3
  database: db
/test.sqlite3
  timeout: 
5000

production:
  adapter: sqlite3
  database: db
/production.sqlite3
  timeout: 
5000

这个文件告诉我们,此刻RoR采用的数据库适配器是sqlite3,如果是在开发环境下我们的数据库文件将会是名为:development.sqlite3的文件。另外有对应的测试,生产数据库,目前这一切都只是纸上谈兵,我们需要让他们getting real!


 rake db:create RAILS_VERSION='development'

搞定!此时回到db目录下,你会看到一个名为development.sqlite3的文件已经存在了,这就是我们的数据库(不需要任何额外的软件,不需要冗长的安装或复杂的配置)。也许你会奇怪这个rake命令是干什么的?其实他就类似Java世界中的Ant或Maven,是一个用于构建的工具

④创建model,controller,view....

我们决定要实现一个能够用于添加,修改,删除,展示产品的web应用,每个product都有title,description,image,price数据。在传统的Java做法中,我们需要做以下的步骤:

 A.定义Domain
 B.使用XML文件定义一个映射文件
 C.通过ORM工具建立Domain和XML描述的表格之间的映射
 D.编辑web.xml文件,定义一系列的过滤器,servlet,mapping
 E.创建一至多个Sevlet来完成Controller的功能
 F.定义sevice接口和实现接口
 G.定义dao接口和实现接口
 H.在Spring的配置文件中定义DataSource,IoC,事务管理器

有时侯我们只是要实现一个看似很简单的功能,但是Java的框架和思维已经把我们限制在一个奇怪的圈子“没有使用XML文件的应用就不是好的应用,因为他不够灵活~~,没有使用三层结构的应用就不是好的应用,因为它的逻辑会耦合”。的确在企业级应用这种做法无疑是正确且必须的!但是如果放在Web,互联网的环境中这种做法无疑过于笨重,我们需要需要尽快地把创意变成可以看得见的东西(敏捷宣言第二条:我们认为可以工作的软件 胜过 面面俱到的文档)

让我们来看看rails如何简化程序员的工作吧!

 ruby script/generate scaffold product title:string description:text image_url:string price:decimal

接下来我们会看到在console窗口输出了一大堆东西,最重要的是它帮我们创建了如下的资源:



包括了模型:product.rb,控制器:products_controller.rb,视图:index,new,edit,show。一切都有了
 
⑤为数据完整性添加控制

为了让我们的程序更加智能,我们决定添加某些验证的功能,例如非空验证,长度验证,唯一性验证,格式验证,数字验证。一切都没有问题,Rails早就帮我们想好了。于是我们来到app/models/product.rb。使用文本编辑器编辑这个文件,加入如下的命令:

validates_presence_of :title, :description, :image_url, :price
validates_length_of :title, :minimum 
=> 10
validates_numericality_of :price
validates_uniqueness_of :title


从字面上看我们知道这分别用于验证某些字段非空,长度不能下小于10个字符,价格必须是数字类型,而且标题必须全局唯一。太简单了!

⑥Getting real

上面我们通过4个简单的命令就完成了一个简单的带验证功能的CRUD功能的应用,那么是不是一切就完成了呢?不是---我们还需要真正的提交:migrate。我们需要把我们所做的一切工作告诉rails,这样rails才会把这些工作映射到底层的数据库。于是我们再次执行

 rake db:migrate

好了!提交工作完成,migrate真是一个魔术般的命令,它能知道当前所做的工作有哪些是已经提交的,那些是未提交的(嗯~很有版本控制的味道嘛,而实际上这也是用了版本控制的理念,只不过是在sqlite3的数据中维护一个叫做:schema_info/schema_migration的表用来记录migration的版本号)

⑦浏览我们的工作

在ruby运行时console窗口,我们输入如下命令:ruby script/server WEBrick,启动WEBrick服务器,然后在浏览器输入如下地址:http://localhost:3000/products

一切就是如此简单!我们拥有一个可以进行CRUD的简单应用了,而这一切不过仅仅依靠几行命令及几行代码

⑧总结

下面我们来回忆一下整个过程,我们会发现使用RoR创建Web应用真是如此简单而充满乐趣!

●命令:
 A.rails 项目名称
 B.rake db:create RAILS_VERSION='数据库模式'
 C.ruby script/generate scaffold 表名 字段名:字段类型
 D.rake db:migrate
 E.ruby script/server WEBrick

●代码:
 validates_presence_of :title, :description, :image_url, :price
 validates_length_of :title, :minimum => 10
 validates_numericality_of :price
 validates_uniqueness_of :title

只需要花你差不多了5分钟的时间而已~,That's all !

●注意点:

首先,上面的所有命令最好都基于项目的顶级目录下执行。其次对于rake db:migrate 这个命令,建议在每一次都模型进行修改操作后都执行一次。就像我们每次修改了代码后使用SVN的commit命令一样,越早提交越好,提交的改变越小越好。事实上,这也符合敏捷开发的原则:小步前进,频繁提交和重构



-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2010-05-15 12:02 Paul Lin 阅读(646) 评论(0)  编辑  收藏 所属分类: RoR

只有注册用户登录后才能发表评论。


网站导航:
 
<2010年5月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(21)

随笔分类

随笔档案

BlogJava热点博客

好友博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜