《Agile Web Development with Rails》抄书笔记(02):Rails之初体验
《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,如下图所示:
从这个图片中可以看出,可以通过修改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和上面的变量名保持一致 %>
再次刷新浏览器,是不是再次正常显示出时间了?
经过上面的折腾,相信你对这里的关联有一定体会了。下面,我们来了解一下整个处理过程:
- 用户访问http://127.0.0.1:3000/say/hello;
- Rails根据URL去匹配路由规则,然后将URL的最后两段,分成两部分。第一部分say被解析成一个Controller名称的一部分,然后创建一个SayController(在app/controllers/say_controller.rb中定义)对象;
- hello用来标识action。Rails将调用Controller中的同名方法进行处理客户端的请求。这里,将创建一个名称为time的Time对象;
- Rails去查找合适的视图。在app/views目录下,查找和Controller同名(say)的目录,然后在其子目录中,查找和Action同名(hello)的erb文件,这里是hello.html.erb;
- Rails处理ERB文件,执行里面的Ruby代码,替换由Controller设置的变量;
- 将结果返回给浏览器。Rails完成处理过程。
页面互联
根据上一小节的内容,可以看出,目前应用有两个链接:http://127.0.0.1:3000/say/hello和http://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
参考资料
原文链接:https://wordpress.diguage.com/archives/105.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。