Chinaunix首页 | 论坛 | 博客
  • 博客访问: 398956
  • 博文数量: 69
  • 博客积分: 1984
  • 博客等级: 上尉
  • 技术积分: 953
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-28 00:43
个人简介

学无所长,一事无成

文章分类

全部博文(69)

文章存档

2015年(19)

2014年(14)

2013年(9)

2012年(17)

2010年(10)

我的朋友

分类: Python/Ruby

2012-08-07 12:57:18

参考文章:Agile Web Development with Rails, 4th Edition

 

Ruby on Rails 学习-第一章:环境准备

 

零、环境准备:

1、使用taobao镜像

  1. $ gem sources --remove
  2. $ gem sources -a
  3. $ gem sources -l
  4. *** CURRENT SOURCES ***
  5. # 请确保只有 ruby.taobao.org
  6. $ gem install rack

2、安装 javascript runtime (因为 rails3 内部支持 coffeescript ,所以需要 javascript runtime)

execjs 支持以下 javascript runtime:

  • - Google V8 embedded within Ruby
  • - Mozilla Rhino embedded within JRuby
  • Apple JavaScriptCore - Included with Mac OS X
  • (JScript)

我们这里安装 therubyracer
# libv8 同 therubyracer 有冲突,所以要 uninstall

  1. $ gem uninstall libv8
  2. $ gem install therubyracer
  3. $ gem install execjs

一、安装 rails 3.2.7

  1. gem install rails

二、生成 Rails API 文档

  1. rails_apps> rails new dummy_app
  2. rails_apps> cd dummy_app
  3. dummy_app> rake doc:rails

 行这一步时会报错,始终说找不到 javascript runtime,实际上我们已经安装了。解决办法如下:
vi dummy_app/ Gemfile ,添加如下:

  1. # gem 'execjs' ;这行可以不添加
  2. gem 'therubyracer'

然后运行如下就ok 了。 

  1. dummy_app> bundle install
  2. dummy_app> rake doc:rails

rake doc:rails 这一步完成后,在 doc/api 会生成完整的 Rails API 文档。可以讲 这个目录丢到你的桌面上,以备参考。其他的东西可以删除了。文档查看,可以打开 doc/api/index.html 文件。

Rails 的文档我们也可以在线查看:。 

Ruby on Rails 学习-第二章:实战

2.1 创建一个 App

运行如下指令

  1. rubys> cd work
  2. work> rails new demo

  1. ~/work/demo# ls -p
  2. app/ config.ru doc/ Gemfile.lock log/ Rakefile script/ tmp/
  3. config/ db/ Gemfile lib/ public/ README.rdoc test/ vendor/

现在我们只关注一个目录: app/   # => 我们的应用程序会放在这里 

现在我们启动服务

  1. ~/work/demo$ rails server
  2. => Booting WEBrick
  3. => Rails 3.2.7 application starting in development on http://0.0.0.0:3000
  4. => Call with -d to detach
  5. => Ctrl-C to shutdown server
  6. [2012-08-06 16:23:36] INFO WEBrick 1.3.1
  7. [2012-08-06 16:23:36] INFO ruby 1.9.3 (2011-10-30) [x86_64-linux]
  8. [2012-08-06 16:23:36] INFO WEBrick::HTTPServer#start: pid=28337 port=3000

  

成功了,我们会得到一个缺省的页面。

我们还可以指定 web server 。这里 webrick 是一个纯 ruby 语言写的 web server。

  1. ~/work/demo$ rails server webrick

  

2.2 Hello, Rails! p38

让我们添加点内容。

  1. ~/work/demo$ rails generate controller Say hello goodbye
  2.       create app/controllers/say_controller.rb
  3.        route get "say/goodbye"
  4.        route get "say/hello"
  5.       invoke erb
  6.       create app/views/say
  7.       create app/views/say/hello.html.erb
  8.       create app/views/say/goodbye.html.erb
  9.       invoke test_unit
  10.       create test/functional/say_controller_test.rb
  11.       invoke helper
  12.       create app/helpers/say_helper.rb
  13.       invoke test_unit
  14.       create test/unit/helpers/say_helper_test.rb
  15.       invoke assets
  16.       invoke coffee
  17.       create app/assets/javascripts/say.js.coffee
  18.       invoke scss
  19.       create app/assets/stylesheets/say.css.scss

我们需要关注的第一个源文件是:app/controllers/say_controller.rb,内容如下:

  1. class SayController < ApplicationController
  2.   def hello
  3.   end
  4.   def goodbye
  5.   end
  6. end

输入: 看下效果 ....

Rails and Request URLs

Our First Action p40

注:MVC 对应三个目录都在 app 下。

修改 say controller 对应的的视图文件:app/view/say/hello.html.erb。 

  1. Hello from Rails!

 将视图修改为动态的。我们这里会添加一个动态显示时间。

我们的方法将 Ruby 代码嵌入 hello.html.erb 模版文件中。Rails 会通过 erb 系统调用处理 .erb 文件中嵌入的 Ruby 代码。

ERb 是一个过滤器,在 Rails 安装时自动安装,它会将输出信息进行转换。<%=  ...  %>间的内容将作为 Ruby 代码处理,返回结果会转化成 String。

  1. Download work/demo2/app/views/say/hello.html.erb
  2. Hello from Rails!

  3. It is now <%= Time.now %>

  添加时间到控制器

以上代码比较丑陋,我们最好把数据处理放到 controller 中。

controller 修改如下:

  1. Download work/demo3/app/controllers/say_controller.rb
  2. class SayController < ApplicationController
  3.     def hello
  4.         @time = Time.now
  5.     end
  6.     def goodbye
  7.     end
  8. end

view 文件修改如下:

  1. Download work/demo3/app/views/say/hello.html.erb
  2. Hello from Rails!

  3. It is now <%= @time %>

以上修改的好处:做到 MVC 的分离,程序更灵活,逻辑更清晰。

目前为止我们已完成

  • 1、
  • 2、route 处理:say 会成为类 SayController 的一个实例。(app/controllers/say_controller.rb 文件)
  • 3、hello 是一个 action ,会调用 say.hello 方法
  • 4、搜索 app/views/ 目录下的同名模板。(app/views/say/hello.html.erb 文件)
  • 5、Rails 通过 erb 模板处理系统,执行嵌入式 Ruby 代码。
  • 6、结果返回到浏览器,结束处理。

2.3 Linking Pages Together

让我们在 view 中加入 link 链接。


 

这种方法可用,但很笨拙。如果我们的 web server 做了迁移,目录发生了变化,那就需要手工逐个调整了。Rails 提供了很多 helper methods ,我们可以使用 link_to


link_to 的第一个参数:超文本链接显示的文本。
第二个参数指示 Rails 产生一个指向 goodbye action 的链接,这里就是 /say/goodbye。 

2.4 What We Just Did

接下来,我们创建一个更为大型的应用

Playtime

1、自己尝试一下

  1. – Addition: <%= 1+2 %>
  2. – Concatenation: <%= "cow" + "boy" %>
  3. – Time in one hour: <%= 1.hour.from_now %>

2、在页面中显示当前文件目录

controller 文件中某 action 添加:

  1. @files = Dir.glob('*')

对应的 view 文件添加:

  1. <% for file in @files %>
  2. file name is: <%= file %>
  3. <% end %>


       

       

      Ruby on Rails 学习-第三章:Rails Applications 的架构

      3.1 Models, Views, and Controllers

      1979 年,Trygve Reenskaug 提出了一种新的软件架构,将应用拆分为三个部分:models, views, 和 controllers。

      models 经常是代表数据模型。

      views 是用户接口,一般指的是用户看到的应用界面,它一般是一种数据的展现方式。

      controllers 总体控制程序,接受外部请求,同 model 交互,最后将 views 展现给用户。

      以上就是我们所熟知的 MVC 架构。这种架构最初用于 GUI 程序设计, Ruby on Rails 同样采用这种架构。

       

      3.2 Rails Model Support

      传统上我们将数据存放在关系型数据库中,而我们的 Ruby on Rails 是面向对象的。两者很难匹配,所以我们需要 ORM(对象关系映射)

      Object-Relational Mapping -- 对象关系映射

      ORM 库将数据库中的一张表映射成一个类。如 orders 表,对应 Order 类。每条记录对应该类的一个实例对象。对于每个字段有 set、get等方法。

      另外,ORM 封装的类具有类一级的方法,对应数据库表一级的操作。比如,我们根据 id 查找 order ,那么我们需要使用类方法进行查找,代码如下:

      order = Order.find(1)

      puts "Customer #{order.customer_id}, amount=$#{order.amount}"

       

      有时返回的不止一条记录,返回的是一个对象集合。

      Order.where(:name => 'dave').each do |order|
      puts order.amount
      end

      一个对象 object 对应一条记录,这个 object 有很多实例方法可以操作该记录。比如 save 方法:

      Order.where(:name => 'dave').each do |order|
      order.pay_type = "Purchase order"
      order.save
      end

       

      总结,ORM 将表映射成类,记录映射成对象,字段映射成对象的属性。类方法进行表级操作,实例方法用于记录级操作。

       

      Active Record


      Active Record 就是一个 Rails 支持的 ORM。它遵循如下ORM原则:表映射成类,记录映射成对象,字段映射成对象属性。它同其他 ORM 的主要差别在于配置方式。举例如下:

      require 'active_record'
      class Order < ActiveRecord::Base
      end
      order = Order.find(1)
      order.pay_type = "Purchase order"
      order.save

       

      Active Record 是 Rails MVC 体系中 model 部分的坚强基石。

       

      3.3 Action Pack: The View and Controller p54

      仔细考量 view 和 controller ,会发现它们两者关系非常紧密。controller 提供数据给 view ,同时接受 view 界面上操作产生的各种事件。所以在 Rails 中将 controller 和 view 捆绑到一起,称之为 Action Pack。尽管如此,这两部分的代码也是截然分开,非常清晰的。

      View Support

      动态内容由模版产生。Rails 中常用的有三种:

      1、嵌入式 Ruby (ERb),类似于 PHP 或 JSP,尽管很灵活方便,但一般认为这有点背离 MVC 的精神。因为此种方式可能会将 model 或 controller 的处理逻辑添加进来。适度使用还是没有问题,不能滥用。

      2、XML Builder 利用 Ruby 代码构架 XML 文档。在 p408 讨论 xml.builder 模版。

      3、RJS 视图。允许你在服务端创建 javascript 代码片度,然后再浏览器执行。这用于创建动态的 Ajax 接口是非常棒的,P145 页讨论。

       

      And the Controller!

      1、负责将外部的 url 请求 routing 到内部的 action。

      2、管理 caching,可以大幅提高性能。

      3、管理 helper modules 。可以不用侵入代码,即可扩展 view 模板。

      4、管理 session。提供用户同应用的持续**互。

      深入学习 Rails 前,我们还是温习一下 Ruby 语言吧。

       

      Ruby on Rails 学习-第四章:Ruby 语言介绍 p56

阅读(2456) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~