Rails实战圣经阅读笔记
前言
由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路由设计,命名路由。两个核心精神:
- URL代表Resource, 命名路由实现,路由子系统
- 同一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