首页 > 动态语言, 挨踢(IT) > 《Agile Web Development with Rails》抄书笔记(02):Rails之初体验

《Agile Web Development with Rails》抄书笔记(02):Rails之初体验

2013年3月7日 发表评论 阅读评论 1,255 人阅读    

《Agile Web Development with Rails》抄书笔记系列

  “《Agile Web Development with Rails》抄书笔记系列”目录

  在上一节中,D瓜哥简单讲解了一下Rails环境的搭建。这一节,D瓜哥将通过一个小小的例子,来给大家演示Rails的牛逼之处!

新建工程

  用过Java的人都知道,即使在Eclipse等集成开发工具中,新建一个工程也相当麻烦。各种选择、各种设置,真心很麻烦。那叫一个纠结啊!(不瞒大家,D瓜哥就是Java攻城师一枚。)

  您知道Rails中新建一个工程需要多大的工作量吗?如果我告诉你,只需要一条命令,你信吗?我们来试试吧。命令如下(这里假设,我们新建的工程名为demo):

cd <Word_Dir>     # 先进入到你的工作目录下
rails new demo    # 新建工程demo

  然后,会有一堆输出,这个先暂时不用理。现在,进入demo目录,启动Rails服务器,命令如下:

cd demo    
rails server   # 启动工程

  不出意外,可以从浏览器中访问一下:http://127.0.0.1:3000/,查看一下工程运行情况了。

解决联网问题

  大家在新建工程时,在进行到”bundle install”时,可能会报网络连接失败等类似的错误。这是由于国内特殊的网络问题。这是由于Ruby Gems托管到了AWS上,访问时,偶尔会抽风!我们只需要修改一下Ruby Gems的镜像服务器地址,让其访问国内的镜像服务器即可。修改方法也很简单,进入新建工程的目录下,打开Gemfile文件,找到相应的内容(一般是第一行),将其修改成如下内容即可:

#source 'https://rubygems.org'
source 'http://ruby.taobao.org/'

  再次感谢李华顺!感谢淘宝网!修改完成后,允许如下命令,完成项目新建:

bundle install

使用本地Gem新建工程

  如果已经新建过一个或者多个Rails工程,则工程相关的Gem包都已经安装到本地了。所以,我们再次新建工程的时候,可以使用本地的Gem包,而不用联网下载。这样的指令和上面的稍有一些不同。如下:

rails new <Project_Name> --skip-bundle
cd <Project_Name>
bundle install --local

工程目录初识

  刚刚新建工程时,Rails输出了一堆文字,新建了一堆文件。下面,D瓜哥Rails工程的各个目录以及个别文件做个简要介绍。工程目录树如下:

$ tree
.
|-- app   # 存放项目的代码,Model、View、Controller都在此,大部分工作在此进行。
|   |-- assets
|   |   |-- images   # 存放图片
|   |   |   `-- rails.png
|   |   |-- javascripts   # 存放JavaScript代码
|   |   |   `-- application.js
|   |   `-- stylesheets   # 存放CSS文件
|   |       `-- application.css
|   |-- controllers   # 存放控制器Controller
|   |   `-- application_controller.rb
|   |-- helpers   # 存放视图辅助类,一些常用的代码段
|   |   `-- application_helper.rb
|   |-- mailers
|   |-- models   # 存放Model
|   `-- views   # 存放生成HTML的所有模板文件
|       `-- layouts
|           `-- application.html.erb
|-- config   # 存放配置文件
|   |-- application.rb
|   |-- boot.rb
|   |-- database.yml   # 数据库连接信息
|   |-- environment.rb
|   |-- environments
|   |   |-- development.rb
|   |   |-- production.rb
|   |   `-- test.rb
|   |-- initializers
|   |   |-- backtrace_silencers.rb
|   |   |-- inflections.rb
|   |   |-- mime_types.rb
|   |   |-- secret_token.rb
|   |   |-- session_store.rb
|   |   `-- wrap_parameters.rb
|   |-- locales
|   |   `-- en.yml
|   `-- routes.rb   # URL映射,或者路由
|-- config.ru
|-- db   # 存放DB结构(Schema)的信息。
|   `-- seeds.rb
|-- doc   # 存放文档,RDoc自动生成的文档
|   `-- README_FOR_APP
|-- Gemfile   # Gem依赖配置文件
|-- Gemfile.lock   # 根据Gemfile生成的文件
|-- lib   # 存放应用程序运行过程中所需要的类,会被自动加载
|   |-- assets
|   `-- tasks
|-- log   # 存放程序运行期间产生的日志
|-- public   # Web能访问的目录,app/assets目录处理后生成的图片、JS和CSS存放于此
|   |-- 404.html
|   |-- 422.html
|   |-- 500.html
|   |-- favicon.ico
|   |-- index.html   # 默认的首页
|   `-- robots.txt   # 真是难以想象,这个文件也建立了!
|-- Rakefile
|-- README.rdoc
|-- script   # 一些有用的脚本用来启动和生成代码
|   `-- rails
|-- test   # 单元和功能测试
|   |-- fixtures   
|   |-- functional   # 功能测试
|   |-- integration
|   |-- performance
|   |   `-- browsing_test.rb
|   |-- test_helper.rb
|   `-- unit   # 单元测试
|-- tmp   # 临时文件
|   `-- cache
|       `-- assets
`-- vendor   # 一些程序依赖的外部类库,和lib一样,也是自动加载的
    |-- assets
    |   |-- javascripts
    |   `-- stylesheets
    `-- plugins

37 directories, 37 files

  这里,大家对各个目录有一个基本认识就行了。以后用到哪些目录,还会再详细介绍的。

Hello, Rails

  在编程界,”Hello, World”绝对是大名鼎鼎,可谓无人不知无人不晓啊!D瓜哥也难逃俗套,整个”Hello,Rails”。

  由于Rails是MVC的一个实现,而且View和Controller联系很紧密,所以,我们只需要新建一个Controller即可。在Rails,这个工作很简单,只需要一个简单的命令即可,配套的View模块文件也会一同生成。命令以及执行情况如下:

rails generate controller Say hello goodbye
      create  app/controllers/say_controller.rb
       route  get "say/goodbye"
       route  get "say/hello"
      invoke  erb
      create    app/views/say
      create    app/views/say/hello.html.erb
      create    app/views/say/goodbye.html.erb
      invoke  test_unit
      create    test/functional/say_controller_test.rb
      invoke  helper
      create    app/helpers/say_helper.rb
      invoke    test_unit
      create      test/unit/helpers/say_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/say.js.coffee
      invoke    scss
      create      app/assets/stylesheets/say.css.scss

  从输出的这个日志信息也可以看出来,Rails新建了一些文件。我们首先来打开app/controllers/say_controller.rb来查看一下这个Controller的内容:

class SayController < ApplicationController
  def hello
  end

  def goodbye
  end
end

  里面什么内容也没有,不过从代码中可以看出,集成了ApplicationController类。看来应该有一些Controller的共有方法和功能。但是,hello方法和goodbye方法是空的。他们究竟做了什么呢?我们打开页面看一下,打开http://127.0.0.1:3000/say/hello,如下图所示:

Rails Say Hello

  从这个图片中可以看出,可以通过修改app/views/say/hello.html.erb文件,来修改显示内容。下面我们来修改这个文件,让它说”Hello, Rails”。修改后的代码如下:

<h1>Hello, Rails</h1>
<p>Find me in app/views/say/hello.html.erb</p>

  这时,刷新页面,看看是否如我们预期的那样输出的。如果你会抱怨,怎么没有动态内容?那么,我们现在来动态显示当前时间。代码如下:

<h1>Hello, Rails</h1>
<p>It is now<%=Time.now %></p>

  再次刷新页面,看看是否输出了当前时间。

  为了能让你感受到Controller和View(这里就是hello.html.erb文件)之间的联系,我们现在再次修改代码。将app/controllers/say_controller.rb的代码修改成如下:

class SayController < ApplicationController
  def hello
    @time = Time.now
  end

  def goodbye
  end
end

  将app/views/say/hello.html.erb的代码修改成如下:

<h1>Hello, Rails</h1>
<p>It is now<%= @time %></p>
<% # 注意这里的time和上面的变量名保持一致 %>

  再次刷新浏览器,是不是再次正常显示出时间了?

  经过上面的折腾,相信你对这里的关联有一定体会了。下面,我们来了解一下整个处理过程:

  1. 用户访问http://127.0.0.1:3000/say/hello
  2. Rails根据URL去匹配路由规则,然后将URL的最后两段,分成两部分。第一部分say被解析成一个Controller名称的一部分,然后创建一个SayController(在app/controllers/say_controller.rb中定义)对象;
  3. hello用来标识action。Rails将调用Controller中的同名方法进行处理客户端的请求。这里,将创建一个名称为time的Time对象;
  4. Rails去查找合适的视图。在app/views目录下,查找和Controller同名(say)的目录,然后在其子目录中,查找和Action同名(hello)的erb文件,这里是hello.html.erb;
  5. Rails处理ERB文件,执行里面的Ruby代码,替换由Controller设置的变量;
  6. 将结果返回给浏览器。Rails完成处理过程。

页面互联

  根据上一小节的内容,可以看出,目前应用有两个链接:http://127.0.0.1:3000/say/hellohttp://127.0.0.1:3000/say/goodbye。但是,这两个方法是孤立的。我们怎样让它们连接到一起呢?

  也许,你已经想到,在ERB文件中直接使用<a>标签,添加两个链接就行了。但是,这样不利于维护,如果以后的服务器或者路径变了,要把所有相关的文件都打开重新修改一遍。

  其实,Rails内置了方法,只需要如下方式修改就行了:

<h1>Hello, Rails</h1>
<p>It is now<%= @time %></p>

<p> 
  Time to say 
  <%=link_to "Goodbye", say_goodbye_path %>! 
</p>

  使用link_to方法生成链接,第一个参数是链接要显示的文字,第二个是生成的路径。路径也有一定的规则:”Controller名称”_”Action名称”_path。

  这里只给出一个例子,另外一个例子大家可以练习一下。

常用命令

  上面的例子中就用了一些命令。在以后的章节中,还会接触到不少命令。这里给大家介绍一些比较常见的命令。如下:

# 新建一个rails工程 
rails new <Project_Name> 

开启服务 
rails server [-p <Port_Number>]

# 操作数据库 
sudo rails dbconsole   # 如果是ubuntu,需要sudo,要不然权限有问题 

# 通过rails的scaffold脚手架生成一个简易Web  CRUD程序,包括一组Model、Views和Controller
rails generate scaffold person name:string bio:text birthday:date

# 创建一个model 
rails generate model <Model_Name> 

# 删除这个创建的model 
rails destroy model <Model_Name> 

# 创建一个controller
rails generate controller <Controller_Name> [Action_Name]?
# 注意:创建一个Controller时,会把相关的View也创建处理。
# Action可以有多个,中间使用空格分隔

# 创建数据库(指定环境需要加上:  RAILS_EVN=product)
rake db:create   # 根据config/database.yml中的配置创建各环境下的空数据库

# 根据app的migration 文件生成对应的表
rake db:migrate  

# 执行载入种子资料(开发用的测试数据库的数据),种子文件存储在db/seed.rb
rake db:seed 

# 预处理app/assets目录下的Javascript、CSS以及图片
# 最新版的Rails的样式使用SCSS来定义,必须预处理一下页面才能正常显示。
rake assets:precompile

# 生成Rails API文档
rake doc:rails   # /doc/api目录下就有了一份完整的Rails API文档

# 进入控制台 
rails c 
# 或者 
rails console 


# 安装plugin
rails plugin install  <Plugin_URL>   #对应的plugin会被安装到Vendor目录下


# 为了加快新建一个WEB应用程序,而不访问网络,可以采用以下步骤,快速建立
# 前提是曾经用访问网络的方法,新建过一个
rails new <Project_Name> --skip-bundle
cd <Project_Name>
bundle install --local

 

参考资料

  1. Rails创建项目的目录结构
  2. Rails详细介绍(一)目录结构
  3. rails3 中的一些命令记录
  4. Rails3学习笔记与参考1–基本命令参考


作 者: D瓜哥,https://www.diguage.com/
原文链接:https://wordpress.diguage.com/archives/105.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。

分类: 动态语言, 挨踢(IT) 标签: , ,