• Rails 2.0 step by step [翻译版] - [WEB]

    2008-01-26

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://live-free-or-die-hard.blogbus.com/logs/14503545.html

    我在译言网的翻译

    Rails 2.0 循序渐进

    Rails 核心小组在12月7号发布了Ruby on Rails 2.0 。 在这个版本中包含了很多改变, 包括Rails生成脚手架代码的方式. 这个变化也许会给使用根据旧版本做成的教程的人带来困扰。我希望这个教程能帮助读者开始使用Rails 2.0,并能给Rails社区做出贡献。

    这是教程的第一部分,包括如何建立一个Rails应用并在Rails 2.0下运行它。

    教 程的第一部分包括安装Rials并且使用Rails生成一个包括增删改查四个基本数据库功能的应用程序。接下来的部分包括用自己的代码替换view层和 controler层自动生成的代码。教程第一部分的目的是帮助新手了解Rails 2.0带来的改变,并且试作和运行一个基本的应用。

    事实已经证明Rails对于很多项目来说是绝佳的选择。

    注: 如果你在参考一个根据旧版本Rails做成的教程,你最好安装一个旧版本的Rails来配合它。例如,Dave Thomas和David Heinemeier Hansson著的这本 《使用Rails进行敏捷开发》是基于Rails 1.2.x的。本教程稍后会介绍如何安装一个Rails的旧版本。

    使用本教程你需要2.0版之后的Rails。

    你需要在电脑安装MySQL。网上有介绍如何安装MySQL的方法, 本教程并不包括这部分内容。

    安装Rails 2.0
    安装Rails 2.0的方法和安装1.2.x版是一样的。基本步骤如下:

    • 安装Ruby
    • 下载并安装Ruby gems
    • 使用gems安装rails
    这个得到Rails的链接和这个Rails初步链接提供了最好的参考. 根据这两个链接的内容安装Rails。

    在我的debian系统上,用如下命令安装Rails 2.0.

    安装 Ruby:
    切换到超级用户,使用debian package manager安装ruby
    # apt-get install ruby irb ri rdoc build-essential

    安装 Ruby gems:
    然后 下载 Ruby gems, ruby的包管理软件,解压,切换到rubygems目录,运行setup.rb文件:
    $ tar -xvzf rubygems-0.9.5.tgz
    $ cd rubygems-0.9.5
    $ su
    # ruby ./setup.rb

    使用 gems 安装 Rails:
    gem package manager可以安装Rails以及其他。执行如下命令:
    # gem install rails --include-dependencies
    INFO: `gem install -y` is now default and will be removed
    INFO: use --ignore-dependencies to install only the gems you list
    Successfully installed rake-0.7.3
    Successfully installed activesupport-2.0.1
    Successfully installed activerecord-2.0.1
    Successfully installed actionpack-2.0.1
    Successfully installed actionmailer-2.0.1
    Successfully installed activeresource-2.0.1
    Successfully installed rails-2.0.1
    7 gems installed
    Installing ri documentation for rake-0.7.3...
    Installing ri documentation for activesupport-2.0.1...
    Installing ri documentation for activerecord-2.0.1...
    Installing ri documentation for actionpack-2.0.1...
    Installing ri documentation for actionmailer-2.0.1...
    Installing ri documentation for activeresource-2.0.1...
    Installing RDoc documentation for rake-0.7.3...
    Installing RDoc documentation for activesupport-2.0.1...
    Installing RDoc documentation for activerecord-2.0.1...
    Installing RDoc documentation for actionpack-2.0.1...
    Installing RDoc documentation for actionmailer-2.0.1...
    Installing RDoc documentation for activeresource-2.0.1...

    在命令行检查Rails版本:
    $ rails -v
    Rails 2.0.1

    如果安装的过程中遇到问题,请参考上文提到的链接或者去Rails论坛寻求帮助。

    使用老版本
    如果你在使用诸如《使用Rails进行敏捷开发》 这样的书,最好安装旧版本的Rails。使用如下命令:
    # gem install --version=1.2.5 rails --include-dependencies
    INFO: `gem install -y` is now default and will be removed
    INFO: use --ignore-dependencies to install only the gems you list
    Successfully installed activerecord-1.15.5
    Successfully installed actionpack-1.13.5
    Successfully installed actionmailer-1.3.5
    Successfully installed actionwebservice-1.2.5
    Successfully installed rails-1.2.5
    5 gems installed
    Installing ri documentation for activerecord-1.15.5...
    Installing ri documentation for actionpack-1.13.5...
    ...

    $rails -v
    Rails 1.2.5

    升级旧版Rails
    如果要升级旧版Rails到最新版本, 使用如下命令:
    $ gem update rails –-include-dependencies

    现在让我们看看如何用几个命令就做成一个Rails应用并运行它。

    使用 Rails 2.0

    起步
    在Rails 2.0下做成一个工程的方法和以前相比几乎没有变化。本教程从做一个管理Mom and Pop's录像带店的清单开始。我们把这个项目称为 'exchange'。

    创建一个目录来保存我们的工作,然后用'rails'这个命令创建exchange应用程序的骨架。当Rails创建程序的基本结构的时候,屏幕上会显示大量的信息。
    $ mkdir work
    $ cd work
    work$ rails exchange
    create
    create app/controllers
    create app/helpers
    create app/models
    create app/views/layouts
    create config/environments
    create config/initializers
    create db
    create doc
    create lib
    create lib/tasks
    create log
    create public/images
    create public/javascripts
    create public/stylesheets
    create script/performance
    create script/process
    create test/fixtures
    create test/functional
    create test/integration
    create test/mocks/development
    create test/mocks/test
    create test/unit
    create vendor
    create vendor/plugins
    create tmp/sessions
    create tmp/sockets
    create tmp/cache
    create tmp/pids
    create Rakefile
    create README
    create app/controllers/application.rb
    create app/helpers/application_helper.rb
    create test/test_helper.rb
    create config/database.yml
    create config/routes.rb
    create public/.htaccess
    create config/initializers/inflections.rb
    create config/initializers/mime_types.rb
    create config/boot.rb
    create config/environment.rb
    create config/environments/production.rb
    create config/environments/development.rb
    create config/environments/test.rb
    create script/about
    create script/console
    create script/destroy
    create script/generate
    create script/performance/benchmarker
    create script/performance/profiler
    create script/performance/request
    create script/process/reaper
    create script/process/spawner
    create script/process/inspector
    create script/runner
    create script/server
    create script/plugin
    create public/dispatch.rb
    create public/dispatch.cgi
    create public/dispatch.fcgi
    create public/404.html
    create public/422.html
    create public/500.html
    create public/index.html
    create public/favicon.ico
    create public/robots.txt
    create public/images/rails.png
    create public/javascripts/prototype.js
    create public/javascripts/effects.js
    create public/javascripts/dragdrop.js
    create public/javascripts/controls.js
    create public/javascripts/application.js
    create doc/README_FOR_APP
    create log/server.log
    create log/production.log
    create log/development.log
    create log/test.log

    Rails生成了一整套的程序框架。切换到新建的exchange目录,开始工作。
    work$ cd exchange
    exchange$ ls -p
    app/ db/ lib/ public/ README test/ vendor/
    config/ doc/ log/ Rakefile script/ tmp/

    设定Model层和数据库表
    这时候,很多web框架不得不用数据库命令和DDL来创建用来保存录像带信息的表。但是借助Rails中数据和程序的紧密联系,我们可以用Rails来创建和管理我们工程所要用到的表。这就是MVC的设计模式中管理数据的Model层。

    Rails能自动生成exchange工程所用到的数据库和表。查看/exchange/config/database.yml文件,从中你会发现Rails用到的数据库结构。

    你能看到存在不同的表,分别对应开发、测试、发布。这种区分有利于Rails工程的开发和维护。

    和以往的Rails版本不同的是,Rails 2.0使用如下命令创建数据库:
    exchange$ rake db:create:all
    (in /home/sean01/work/exchange)
    exchange$

    启动web server
    Rails内建了自己的web服务器,我们来启动它,看看目前为止我们所做的工作。要启动rails web服务器 WEBbrick,使用如下命令:
    exchange$ 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-12-13 12:01:16] INFO WEBrick 1.3.1
    [2007-12-13 12:01:16] INFO ruby 1.8.5 (2006-08-25) [i486-linux]
    [2007-12-13 12:01:16] INFO WEBrick::HTTPServer#start: pid=3637 port=3000

    打开你的浏览器,指向URL http://localhost:3000,你将看到这个画面:



    点击 'About your application's environment' 链接,一段AJAX代码将列出你程序的明细。



    注意,缺省的环境是开发环境而不是测试、发布环境。这正是我们开发阶段所需要的。

    在WEBbrick server运行的终端安详CRL+C将停止server。

    新旧对比
    接下来几步将展示激动人心的新旧对比。旧版教程会用script/generate一个model然后用migrate文件规划数据库表的项目。然后你再script/generate一个controller、添加脚手架。这在Rails 2.0是行不通的。

    在Rails 2.0中需要的步骤更少,但或许有点儿难以理解,因为如此少的命令完成了如此多的工作。首先从电影租赁表开始。

    简单来说,影片至少应该有个名字、简介以及海报。其他方面比如发行日期、出租率等等可以稍后通过修改表来添加。接下来生成一个model来管理数据库中的表。

    下面的命令将生成model、脚手架、和数据库迁移需要的脚本以及controller、helper和测试支持文件:

    exchange$ ruby script/generate scaffold Movie title:string description:text one_sheet_url:string
    exists app/models/
    exists app/controllers/
    exists app/helpers/
    create app/views/movies
    exists app/views/layouts/
    exists test/functional/
    exists test/unit/
    create app/views/movies/index.html.erb
    create app/views/movies/show.html.erb
    create app/views/movies/new.html.erb
    create app/views/movies/edit.html.erb
    create app/views/layouts/movies.html.erb
    create public/stylesheets/scaffold.css dependency model
    exists app/models/
    exists test/unit/
    exists test/fixtures/
    create app/models/movie.rb
    create test/unit/movie_test.rb
    create test/fixtures/movies.yml
    create db/migrate
    create db/migrate/001_create_movies.rb
    create app/controllers/movies_controller.rb
    create test/functional/movies_controller_test.rb
    create app/helpers/movies_helper.rb
    route map.resources :movies

    生成Movies表

    db/migrate/001_create_movies.rb将创建Movies表,现在看看这个文件:

    这 个文件将创建一个名为movies的表,和Movie model绑定。这是Rails的命名惯例。people表将匹配Person model; cars表将匹配Car model。你可以看到我们传给script/generate命令的参数在migration文件中以字段和类型出现。

    以下命令将生成表:
    exchange$ rake db:migrate
    (in /home/sean01/work/exchange)
    == 1 CreateMovies: migrating ==================================================
    -- create_table(:movies)
    -> 0.0040s
    == 1 CreateMovies: migrated (0.0042s) =========================================

    要看目前为止我们的工作成果,用如下命令启动WEBbrick服务器(如果你不曾用CRL+C停止服务的话):
    /exchange$ 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-12-13 17:12:06] INFO WEBrick 1.3.1
    [2007-12-13 17:12:06] INFO ruby 1.8.5 (2006-08-25) [i486-linux]
    [2007-12-13 17:12:06] INFO WEBrick::HTTPServer#start: pid=4054 port=3000

    把你的浏览器指向URL http://localhost:3000/movies,看看我们的成果。

    看上去很空,那是因为我们还没有录像带呢。 点击'New Movie' 链接, 添加些录像带。

    添加一个名字、简介、海报,然后点击Create。点击'Back'按钮 (不是浏览器的那个)返回,添加另外一个电影。

    这仍然很简陋,不过想想看我们还一行代码都没有写呢!

    Oh CRUD!
    在数据库术语中CRUD可是好东西,它是Create, Read, Update和Delete的缩写,数据库的四个最基本功能。 exchange程序在没写一行代码的情况下就拥有了这些基本功能。它不优美也不花哨,但是它确实有效。

    到目前为止我们都做了什么?
    • 安装 Rails
      #gem install rails --include-dependencies
    • 用rails命令创建了一个程序
      $rails exchange
    • 用rake命令创建数据库
      $ rake db:create:all
    • 用script/generate命令生成脚手架
      $ ruby script/generate scaffold Movie title:string description:text one_sheet_url:string
    • 用migration文件生成数据库表
      $ rake db:migrate
    • 用script/server命令启动server
      $ ruby script/server
    • 启动浏览器输入编辑数据
      http://localhost:3000/movies

    收藏到:Del.icio.us