21 November 2014

前言

由xdite的博客,接触到ihower的博客,然后看到ihover写的Ruby on Rails实战圣经。ps: 人生阅读第一本繁体字作品是司汤达的《红与黑》。

简介

Perl CGI,程序与HTML页面的混合,HERE文档。模板为主的程序语言: PHP,ASP - 在HTML中嵌入程序和SQL语句。Web 2.0和云端,网站规模的增加,更多商业逻辑和功能 – web框架的出现。框架是规范和惯例,是基础的软件架构和体系。

MVC: Model, View, Controller。web框架 - 实现MVC和不实现MVC。Web MVC和 MVC的区别。

web框架包含的功能: ORM, URL路由,以及其他函数库(Template, Email, Session, Cache, Javascript/Ajax, Test)。

RoR的特点: DRY, CoC, REST, 前端应用服务器, 生态圈丰富

动态语言处理50-500的 reqs/s, TDD。 Ruby: 简洁优雅可读性,Internal DSL(Rake, RSpec, Chef等)

开发环境

Ruby和Rails的好用gem包: The Ruby Toolbox

常见错误:

  • NoMethodError: 方法名打错了
  • NameError: 使用了未初始化的参数
  • SyntaxError: unexpected $end: 缺少了end,rails不提供行数,使用ruby -w

Ruby

Ruby使用手册: http://guides.ruby.tw/ruby/

除了MRI之外,Ruby支持平台:

  • JRuby是由Java实现的Ruby,运行在高效能、支援系统执行线程及有非常多函数库的Java虚拟机器(JVM)上。JRuby算是目前Ruby要开发跨平台(Windows、Mac和Linux)桌面软体最好的选择。
  • Rubinuis是用C++、Ruby和LLVM编译器技术实现的Ruby VM,可以在Mac OS X、Debian/Ubuntu、FreeBSD、Windows上执行。LLVM可以说是当代最重要的编译器架构,拥有各种编译器最佳化技术。能给Ruby带来多少效能改善幅度,值得关注。

类型转换: 通过to_xxx。

attr_accessor的作用,Code Block对仅执行一次的调用也很有用。元编程和反射机制,||=操作符。

Ruby的应用: sinatra, Sass、Less、Compass(css设计框架), Chef/Puppet, Vagrant(虚拟机工具)。Rails使用Migration建立数据库的Schema,db/migrate/

布局,Flash(flash),Session,Cache。

RESTful

RESTful路由设计,命名路由。两个核心精神:

  1. URL代表Resource, 命名路由实现,路由子系统
  2. 同一Resource具有不同Representations,respond_to方法实现,xml,json,html等

RESTful的好处:以规范化的方法组织Controllers和Actions。更多解释: REST和RESTful

HTML只用了GET和POST,Rails模拟了PATCH和DELETE。

REST路由和动作的总结:

  • show, new, edit, update, destroy为单数,对单一元素操作
  • index, create为复数
  • event_path(@event)需要参数,HTTP动词决定show,update,destroy
  • events_path无参,动词决定index,create

link_to和button_to方法,:method指定HTTP动作。不开js,link_to无法送出GET以外的请求,button_to使用的form标签,不受限。

常见错误:

  • Unknown action: 拼写错误或路由优先级规则
  • Routing Error: 提供不存在的控制器或参数不合法

respond_to

respond_to支持xml,json,atom等格式。示例代码:

def index
  @events = Event.page(params[:page]).per(5)
  # GET /events(.:foramt)
  # link_to "xml", event_path(event, format: :xml)
  respond_to do |format|
    format.html # index.html.erb
    format.xml  { render :xml => @event.to_xml } # 或 show.xml.builder
    foramt.json { render :json => @events.to_json }
    foramt.atom { @feed_title = "My event list"} # index.atom.builder
  end
end

rake stats代码统计,logroate整理Rails文档。

调试: 在rails console中调用Model的方法,或使用debug方法。通过类似Rails.logger.debug("event: #{@event.inspect}")的代码,查看变量的值。

ActiveRecord - 操作与关联设计

抽象漏洞法则:任何抽象都是有漏洞的。 - Jeol Spolsky。ORM生成的SQL可能不是最佳解,弄懂抽象原理及其所隐藏的东西。高手与新手:知道何时不依赖工具。

Rails可根据表知道Model具有何种属性。在关联对象中,build和create的区别,destroy_all和delete_all的区别。

关联所依赖的键值需要手动在表中创建。

RESTful综合应用

一对多的Resources: Model的嵌套关系映射成资源路由的嵌套关系

注意其中,存在关联的model的控制器中,使用的关联的创建方法:

@event.attendees
@event.attendees.find
@event.attendees.build

环境定制

rails c production启动生产环境,连接到正式数据库上,本地诊断远程服务的错误, 多环境运行时。 运行时配置的文件: config/environment.rb以及config/environments/xxx.rb。环境文件处理的任务: 1. 设置加载路径 2. 创建资源 3. 各种配置

rails c --sandbox

后记

学习Rails路途曲折,起初借图书馆的书《web开发敏捷之道 第4版》和《ruby编程语言》,还没看完就毕业工作了。工作后,看代码和Rails官方指南,整体上以抄和猜来学习。看《Ruby on Rails Tutorial 第二版》,学Sinatra以及Rack了一段时间,看《Ruby on Rails 实战圣经》,然后打算在回头将上面的书再浏览一遍。

整体的学习过程是:看书,实践,再看书,再实践。理论与实现之间的差别,通过曲折的实践来弥补。




傲娇的使用Disqus