Rails入门1-安装并创建第一个Rails程序

Rails 入门

本文介绍如何开始使用 Ruby on Rails。

读完本文,你将学到:

  1. 如何安装 Rails,新建 Rails 程序,如何连接数据库;
  2. Rails 程序的基本文件结构;
  3. MVC(模型,视图,控制器)和 REST 架构的基本原理;
  4. 如何快速生成 Rails 程序骨架;

附:MVC模型
welcome abord

  • 视图:
    视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由HTML元素组成的界面,在新式的Web应用程序中,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Adobe Flash和像XHTML,XML/XSL,WML等一些标识语言和Web services.
    MVC好处是它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。
  • 模型:模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用像EJBs和ColdFusion Components这样的构件对象来处理数据库,被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
  • 控制器:控制器接受用户的输入并调用模型和视图去完成用户的需求,所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

1、前提条件

  • Ruby 1.9.3 及以上版本,本实验选用2.1.4

  • 包管理工具 RubyGems,随 Ruby 1.9+ 安装。想深入了解 RubyGems,请阅读 RubyGems 指南,本实验选用4.1.8

  • SQLite3 数据库

  • 测试系统为Red Hat Enterprise Linux Server release 6.4 (Santiago),也可以选择其它平台版本的系统进行测试

1.1、安装rvm管理工具

通过rvm可以非常方便的安装ruby各版本环境,并且能够在使用过程中进行版本切换

[root@ruby2 ~]# cd /usr/local/src/
[root@ruby2 src]# wget https://github.com/wayneeseguin/rvm/archive/stable.tar.gz
[root@ruby2 src]# tar xf stable 
[root@ruby2 src]# cd rvm-stable/
[root@ruby2 rvm-stable]# ./install 
Creating group 'rvm'

Installing RVM to /usr/local/rvm/
Installation of RVM in /usr/local/rvm/ is almost complete:

  * First you need to add all users that will be using rvm to 'rvm' group,
    and logout - login again, anyone using rvm will be operating with `umask u=rwx,g=rwx,o=rx`.

  * To start using RVM you need to run `source /etc/profile.d/rvm.sh`
    in all your open shell windows, in rare cases you need to reopen all shell windows.

# Administrator,
#
#   Thank you for using RVM!
#   We sincerely hope that RVM helps to make your life easier and more enjoyable!!!
#
# ~Wayne, Michal & team.

In case of problems: http://rvm.io/help and https://twitter.com/rvm_io

[root@ruby2 rvm-stable]# source /etc/profile.d/rvm.sh #添加rvm搜索路径

1.2、安装依赖包(EPEL获取)

[root@ruby2 src]# wget http://mirrors.hustunique.com/epel/6/x86_64/libyaml-devel-0.1.6-1.el6.x86_64.rpm
[root@ruby2 src]# wget http://mirrors.hustunique.com/epel/6/x86_64/libyaml-0.1.6-1.el6.x86_64.rpm
[root@ruby2 src]# rpm -ivh libyaml-*
warning: libyaml-0.1.6-1.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
warning: package libyaml = 0.1.6-1.el6 was already added, skipping libyaml = 0.1.6-1.el6
Preparing...                ########################################### [100%]
   1:libyaml                ########################################### [ 50%]
   2:libyaml-devel          ########################################### [100%]

1.3、通过rvm安装ruby2.1.4

[root@ruby2 rvm-stable]# rvm list known | grep '\[ruby-\]'  #查看有那些ruby版本可以安装
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p598]
[ruby-]2.1.4
[ruby-]2.1[.5]
[ruby-]2.1-head

[root@ruby2 rvm-stable]# rvm install 2.1.4
Searching for binary rubies, this might take some time.
No binary rubies available for: redhat/6/x86_64/ruby-2.1.4.
Continuing with compilation. Please read 'rvm help mount' to get more information on binary rubies.
Checking requirements for redhat.

Skipping installation of 'libffi-devel', in case you depend on FFI reinstall your ruby after following this instructions:
    https://gist.github.com/rderoldan1/5920539

Installing requirements for redhat.
Updating system.
Installing required packages: glibc-headers, autoconf, gcc-c++, glibc-devel, readline-devel, zlib-devel, openssl-devel, automake, libtool, bison..................
Requirements installation successful.
Installing Ruby from source to: /usr/local/rvm/rubies/ruby-2.1.4, this may take a while depending on your cpu(s)...
ruby-2.1.4 - #downloading ruby-2.1.4, this may take a while depending on your connection...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 11.4M  100 11.4M    0     0  36672      0  0:05:27  0:05:27 --:--:-- 16244
ruby-2.1.4 - #extracting ruby-2.1.4 to /usr/local/rvm/src/ruby-2.1.4....
ruby-2.1.4 - #configuring.....................................................
ruby-2.1.4 - #post-configuration..
ruby-2.1.4 - #compiling.........................................................................................
ruby-2.1.4 - #installing.................................
ruby-2.1.4 - #making binaries executable..
ruby-2.1.4 - #downloading rubygems-2.4.4
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  433k  100  433k    0     0  66344      0  0:00:06  0:00:06 --:--:-- 63362
No checksum for downloaded archive, recording checksum in user configuration.
ruby-2.1.4 - #extracting rubygems-2.4.4....
ruby-2.1.4 - #removing old rubygems.........
ruby-2.1.4 - #installing rubygems-2.4.4..............
ruby-2.1.4 - #gemset created /usr/local/rvm/gems/ruby-2.1.4@global
ruby-2.1.4 - #importing gemset /usr/local/rvm/gemsets/global.gems...........................................................
ruby-2.1.4 - #generating global wrappers........
ruby-2.1.4 - #gemset created /usr/local/rvm/gems/ruby-2.1.4
ruby-2.1.4 - #importing gemsetfile /usr/local/rvm/gemsets/default.gems evaluated to empty gem list
ruby-2.1.4 - #generating default wrappers........
ruby-2.1.4 - #adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
Install of ruby-2.1.4 - #complete 
Ruby was built without documentation, to build it run: rvm docs generate-ri

1.4、设置系统默认ruby环境为2.1.4

[root@ruby2 ~]# rvm use ruby-2.1.4@global --default
Using /usr/local/rvm/gems/ruby-2.1.4 with gemset global
[root@ruby2 ~]# rvm list  #查看系统当前ruby环境版本是否为2.1.4

rvm rubies

=* ruby-2.1.4 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

[root@ruby2 ~]# ruby -v #通过系统命令查看
ruby 2.1.4p265 (2014-10-27 revision 48166) [x86_64-linux]

1.5、确认系统是否安装sqlite3

[root@ruby ~]# yum install sqlite sqlite-devel
[root@ruby2 ~]# sqlite3 --version
3.6.20

2 Rails是什么?

Rails 是使用 Ruby 语言编写的网页程序开发框架,目的是为开发者提供常用组件,简化网页程序的开发。只需编写较少的代码,就能实现其他编程语言或框架难以企及的功能。经验丰富的 Rails 程序员会发现,Rails 让程序开发变得更有乐趣。

Rails 有自己的一套规则,认为问题总有最好的解决方法,而且建议使用最好的方法,有些情况下甚至不推荐使用其他替代方案。学会如何按照 Rails 的思维开发,能极大提高开发效率。如果坚持在 Rails 开发中使用其他语言中的旧思想,尝试使用别处学来的编程模式,开发过程就不那么有趣了。

Rails 哲学包含两大指导思想:

不要自我重复(DRY): DRY 是软件开发中的一个原则,“系统中的每个功能都要具有单一、准确、可信的实现。”。不重复表述同一件事,写出的代码才能更易维护,更具扩展性,也更不容易出问题。
多约定,少配置: Rails 为网页程序的大多数需求都提供了最好的解决方法,而且默认使用这些约定,不用在长长的配置文件中设置每个细节。

3、新建Rails程序

3.1、安装Rails

安装之前请先更改本地gem源为taobao源(国内的gem源比国外快的多)

[root@ruby2 ~]# gem sources -l
*** CURRENT SOURCES ***

https://rubygems.org/
[root@ruby2 ~]# gem sources --remove https://rubygems.org/
https://rubygems.org/ removed from sources
[root@ruby2 ~]# gem sources -a https://ruby.taobao.org/
https://ruby.taobao.org/ added to sources
[root@ruby2 ~]# gem sources -l
*** CURRENT SOURCES ***

https://ruby.taobao.org/

[root@ruby2 ~]# gem install rails  #通过gem命令安装最新版的rails程序
Fetching: thread_safe-0.3.4.gem (100%)
Successfully installed thread_safe-0.3.4
Fetching: minitest-5.4.3.gem (100%)
Successfully installed minitest-5.4.3
Fetching: tzinfo-1.2.2.gem (100%)
Successfully installed tzinfo-1.2.2
Fetching: i18n-0.6.11.gem (100%)
...
Done installing documentation for thread_safe, minitest, tzinfo, i18n, activesupport, erubis, builder, actionview, rack, rack-test, actionpack, tilt, multi_json, hike, sprockets, sprockets-rails, thor, railties, mime-types, mail, actionmailer, arel, activemodel, activerecord, rails after 1839 seconds
25 gems installed

[root@ruby2 ~]# rails -v #查看rails版本
Rails 4.1.8

3.2 创建 Blog 程序

Rails 提供了多个被称为“生成器”的脚本,可以简化开发,生成某项操作需要的所有文件。其中一个是新程序生成器,生成一个 Rails 程序骨架,不用自己一个一个新建文件

[root@ruby ~]# rails new blog1
      create  
      create  README.rdoc
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile
      create  app
      create  app/assets/javascripts/application.js
      create  app/assets/stylesheets/application.css
      create  app/controllers/application_controller.rb
      create  app/helpers/application_helper.rb
      create  app/views/layouts/application.html.erb
      create  app/assets/images/.keep
      create  app/mailers/.keep
...
...
Using spring 1.2.0
Installing sqlite3 1.3.10
Installing turbolinks 2.5.2
Installing uglifier 2.5.3
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
         run  bundle exec spring binstub --all
* bin/rake: spring inserted
* bin/rails: spring inserted

这个命令会在文件夹 blog1 中新建一个 Rails 程序,然后执行 bundle install 命令安装 Gemfile 中列出的 gem。

注:执行 rails new -h 可以查看新程序生成器的所有命令行选项。

生成 blog 程序后,进入该文件夹:

[root@ruby2 ~]# rails new blog1
      create  
      create  README.rdoc
      create  Rakefile
...
Post-install message from rdoc:
Depending on your version of ruby, you may need to install ruby rdoc/ri data:

<= 1.8.6 : unsupported
 = 1.8.7 : gem install rdoc-data; rdoc-data --install
 = 1.9.1 : gem install rdoc-data; rdoc-data --install
>= 1.9.2 : nothing to do! Yay!
         run  bundle exec spring binstub --all
* bin/rake: spring inserted
* bin/rails: spring inserted

[root@ruby2 ~]# cd blog1/
[root@ruby2 blog1]# ll
total 60
drwxr-xr-x 8 root root 4096 Nov 27 22:28 app
drwxr-xr-x 2 root root 4096 Nov 27 22:35 bin
drwxr-xr-x 5 root root 4096 Nov 27 22:28 config
-rw-r--r-- 1 root root  154 Nov 27 22:28 config.ru
drwxr-xr-x 2 root root 4096 Nov 27 22:28 db
-rw-r--r-- 1 root root 1339 Nov 27 22:28 Gemfile
-rw-r--r-- 1 root root 2779 Nov 27 22:35 Gemfile.lock
drwxr-xr-x 4 root root 4096 Nov 27 22:28 lib
drwxr-xr-x 2 root root 4096 Nov 27 22:28 log
drwxr-xr-x 2 root root 4096 Nov 27 22:28 public
-rw-r--r-- 1 root root  249 Nov 27 22:28 Rakefile
-rw-r--r-- 1 root root  478 Nov 27 22:28 README.rdoc
drwxr-xr-x 8 root root 4096 Nov 27 22:28 test
drwxr-xr-x 3 root root 4096 Nov 27 22:28 tmp
drwxr-xr-x 3 root root 4096 Nov 27 22:28 vendor

blog1 文件夹中有很多自动生成的文件和文件夹,组成一个 Rails 程序。本文大部分时间都花在 app 文件夹上。下面简单介绍默认生成的文件和文件夹的作用:

文件/文件夹    作用
app/    存放程序的控制器、模型、视图、帮助方法、邮件和静态资源文件。本文主要关注的是这个文件夹。
bin/    存放运行程序的 rails 脚本,以及其他用来部署或运行程序的脚本。
config/    设置程序的路由,数据库等。详情参阅“设置 Rails 程序”一文。
config.ru    基于 Rack 服务器的程序设置,用来启动程序。
db/    存放当前数据库的模式,以及数据库迁移文件。
Gemfile, Gemfile.lock    这两个文件用来指定程序所需的 gem 依赖件,用于 Bundler gem。关于 Bundler 的详细介绍,请访问 Bundler 官网。
lib/    程序的扩展模块。
log/    程序的日志文件。
public/    唯一对外开放的文件夹,存放静态文件和编译后的资源文件。
Rakefile    保存并加载可在命令行中执行的任务。任务在 Rails 的各组件中定义。如果想添加自己的任务,不要修改这个文件,把任务保存在 lib/tasks 文件夹中。
README.rdoc    程序的简单说明。你应该修改这个文件,告诉其他人这个程序的作用,如何安装等。
test/    单元测试,固件等测试用文件。详情参阅“测试 Rails 程序”一文。
tmp/    临时文件,例如缓存,PID,会话文件。
vendor/    存放第三方代码。经常用来放第三方 gem。

4 Hello, Rails!

首先,我们来添加一些文字,在页面中显示。为了能访问网页,要启动程序服务器。

4.1 启动服务器

现在,新建的 Rails 程序已经可以正常运行。要访问网站,需要在开发电脑上启动服务器。请在 blog 文件夹中执行下面的命令:

[root@ruby2 blog1]# rails server
/usr/local/rvm/gems/ruby-2.1.4@global/gems/execjs-2.2.2/lib/execjs/runtimes.rb:51:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)

报错原因:把 CoffeeScript 编译成 JavaScript 需要 JavaScript 运行时,如果没有运行时,会报错,提示没有 execjs。Mac OS X 和 Windows 一般都提供了 JavaScript 运行时。Rails 生成的 Gemfile 中,安装 therubyracer gem 的代码被注释掉了,如果需要使用这个 gem,请把前面的注释去掉。在 JRuby 中推荐使用 therubyracer。在 JRuby 中生成的 Gemfile 已经包含了这个 gem。所有支持的运行时参见 ExecJS。

解决方法:安装therubyracer

[root@ruby2 blog1]# vim Gemfile  
#source 'https://rubygems.org'
source 'https://ruby.taobao.org'  #更改为taobao源,安装更快
...
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
gem 'therubyracer',  platforms: :ruby  #关闭注释
...

[root@ruby2 blog1]# rails server
Could not find gem 'therubyracer (>= 0) ruby' in the gems available on this machine.
Run `bundle install` to install missing gems.

[root@ruby2 blog1]# bundle install 
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this application for all
non-root users on this machine.
Fetching gem metadata from https://ruby.taobao.org/..........
Resolving dependencies...
Using rake 10.4.0
Using i18n 0.6.11
...
Installing libv8 3.16.14.7
...
Installing ref 1.0.5
...
Installing therubyracer 0.12.1
Using turbolinks 2.5.2
Using uglifier 2.5.3
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.

再次启动rails服务

[root@ruby2 blog1]# rails server
=> Booting WEBrick
=> Rails 4.1.8 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
=> Ctrl-C to shutdown server
[2014-11-28 10:18:16] INFO  WEBrick 1.3.1
[2014-11-28 10:18:16] INFO  ruby 2.1.4 (2014-10-27) [x86_64-linux]
[2014-11-28 10:18:16] INFO  WEBrick::HTTPServer#start: pid=2204 port=3000

上述命令会启动 WEBrick,这是 Ruby 内置的服务器。要查看程序,请打开一个浏览器窗口,访问 http://localhost:3000。应该会看到默认的 Rails 信息页面:

welcome abord

注:要想停止服务器,请在命令行中按 Ctrl+C 键。服务器成功停止后回重新看到命令行提示符。在大多数类 Unix 系统中,包括 Mac OS X,命令行提示符是 $ 符号。在开发模式中,一般情况下无需重启服务器,修改文件后,服务器会自动重新加载。

“欢迎使用”页面是新建 Rails 程序后的“冒烟测试”:确保程序设置正确,能顺利运行。你可以点击“About your application’s environment”链接查看程序所处环境的信息。

welcome abord

4.2 显示“Hello, Rails!”

要在 Rails 中显示“Hello, Rails!”,需要新建一个控制器和视图。

控制器用来接受向程序发起的请求。路由决定哪个控制器会接受到这个请求。一般情况下,每个控制器都有多个路由,对应不同的动作。动作用来提供视图中需要的数据。

视图的作用是,以人类能看懂的格式显示数据。有一点要特别注意,数据是在控制器中获取的,而不是在视图中。视图只是把数据显示出来。默认情况下,视图使用 eRuby(嵌入式 Ruby)语言编写,经由 Rails 解析后,再发送给用户。

控制器可用控制器生成器创建,你要告诉生成器,我想要个名为“welcome”的控制器和一个名为“index”的动作,如下所示:

[root@ruby2 blog1]# rails generate controller welcome index
      create  app/controllers/welcome_controller.rb
       route  get 'welcome/index'
      invoke  erb
      create    app/views/welcome
      create    app/views/welcome/index.html.erb
      invoke  test_unit
      create    test/controllers/welcome_controller_test.rb
      invoke  helper
      create    app/helpers/welcome_helper.rb
      invoke    test_unit
      create      test/helpers/welcome_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/welcome.js.coffee
      invoke    scss
      create      app/assets/stylesheets/welcome.css.scss

运行上述命令后,Rails 会生成很多文件,以及一个路由。

在这些文件中,最重要的当然是控制器,位于 app/controllers/welcome_controller.rb,以及视图,位于 app/views/welcome/index.html.erb

使用文本编辑器打开 app/views/welcome/index.html.erb 文件,删除全部内容,写入下面这行代码:

[root@ruby2 blog1]# vim app/views/welcome/index.html.erb
<h1>Welcome to access www.kisspuppet.com</h1>

4.3 设置程序的首页

我们已经创建了控制器和视图,现在要告诉 Rails 在哪个地址上显示“Hello, Rails!”。这里,我们希望访问根地址 http://localhost:3000 时显示。但是现在显示的还是欢迎页面。

我们要告诉 Rails 真正的首页是什么。

在编辑器中打开 config/routes.rb 文件。

[root@ruby2 blog1]# vim config/routes.rb
Rails.application.routes.draw do
  get 'welcome/index'  # 请求

  # The priority is based upon order of creation: first created -> highest priority.
  # See how all your routes lay out with "rake routes".

  # You can have the root of your site routed with "root"
  # root 'welcome#index'
  root 'welcome#index'  #访问程序的根路径时交给 welcome 控制器中的 index 动作处理
  ...

这是程序的路由文件,使用特殊的 DSL(domain-specific language,领域专属语言)编写,告知 Rails 请求应该发往哪个控制器和动作。文件中有很多注释,举例说明如何定义路由。其中有一行说明了如何指定控制器和动作设置网站的根路由。找到以 root 开头的代码行,去掉注释,
root ‘welcome#index’ 告知 Rails,访问程序的根路径时,交给 welcome 控制器中的 index 动作处理。get ‘welcome/index’ 告知 Rails,访问 http://localhost:3000/welcome/index 时,交给 welcome 控制器中的 index 动作处理。get ‘welcome/index’ 是运行 rails generate controller welcome index 时生成的。

如果生成控制器时停止了服务器,请再次启动(rails server),然后在浏览器中访问 http://localhost:3000。你会看到之前写入 app/views/welcome/index.html.erb 文件的“Hello, Rails!”,说明新定义的路由把根目录交给 WelcomeController 的 index 动作处理了,而且也正确的渲染了视图。
welcome abord

关于路由的详细介绍,请阅读“Rails 路由全解”一文。

参考文献: http://guides.ruby-china.org/getting_started.html


交流方式:

微信公众号:puppet2014,可微信搜索加入,也可以扫描以下二维码进行加入

微信公众号

QQ交流群:296934942