?
深入理解Rails
?
P257 -- P270
?
使用rails new my_app新建项目
?
-config.ru
用于配置Rack WebServer Interface,也可以创建Rails Metal应用,或在该Rails项目中使用Rails Middlewares.详见rails guide
?
? ? ? ? Rails很有趣的一点是她的组织形式。从一个开发者的视角,你的大部分时间是放在高层次的模块上,例如Active Record和Action View。另外有个叫Rails的组建,但是她位于其他的组件之下,默默的协调其他组建,让她们合作无间。同时,这个底层结构很少会被使用到,本节末会提到组件。
?
-Gemfile
用于定制你的Rails项目的依赖,这种依赖也包括数据库,web服务器甚至用于部署的脚本
技术上来讲,该文件是被你的应用所用,你可以在 config/boot.rb和config/application.rb中找到对于Bundler的调用
-Rakefile
定义一些任务包括:运行测试,生成文档,抽取当前项目结构等。在命令行中可以输入以下命令:
rake -–tasks 查看命令清单
rake –describe task 更完整的关于task的使用介绍
?
-README
略
?
关于文档
?
Rails提供了doc:app 的Rake任务来生成文档到doc/下。另外doc:rails命令可以生成当前版本的Rails的文档,doc:guides可以提供可用的指导文档,在你生成该指导文档前,你需要在Gemfile添加 gem RedCloth 一行,保存后运行 bundle install
通过 rake -T doc 命令,可以看到Rails提供的其他文档关联任务
?
关于提供的库文件
lib文件夹中的代码与model view controller并不是严丝合缝的结合。例如,如果你打算写一个用来生成PDF的,这些数据直接从controller直接发送到浏览器(通过 send_data方法),用于生成PDF的代码只需要放在lib目录下。
Lib目录也是个适用放置用于models view controllers分享的代码之处。也许你需要一个验证身份证号码的库,这种计算不属于m v c应放置在lib中
你可以自由在lib下传减子文件夹来归类组织相关的方法。例如lib/pdf_stuff 可以用于放置生成清单,生成文档和pdf的库等
在老的Rails版本里,lib目录被自动加载,如今这是一个需要明确开启才可被加载
需要在config/application.rb中 加入一行
config.autoload_paths += %w(#{Rails.root}/lib)
lib目录下的代码都可以直接访问,如果这些文件包含类,模块并且这些文件的命名是其包含类或模块的名称的小写形式,Rails就可以自动加载这些文件,比如,我们的生成PDF文件是lib/pdf_stuff/receipt.rb. 只要我们的类叫 PdfStuff::Receipt. Rails可以自动加载它
其他的情况,需要使用require机制。在lib目录下的文件,可以直接通过名称require.例如lib/easter.rb可以通过 require 'easter'包含
lib/shipping/airmail.rb需要require “shipping/airmail”
?
关于Rake Tasks
lib目录下有tasks的空目录,这里你可以写自己的Rake任务。
这里有一个简单的例子,Rails提供了一个Rake任务可以用来向你展示最后一次执行的migration,然而我们也许需要一个用于展示所有migration的任务
namespace :db do desc "Prints the migrated versions" task :schema_migrations => :environment do puts ActiveRecord::Base.connection.select_values( 'select version from schema_migrations order by version' ) end end?
?
保存该文件,以.rake结尾。这里我们命名db_schema_migrations.rake
我们可以通过
>rake db:schema_migrations 来运行
?
关于日志(赞略 详见264页)
?
关于静态文件
貌似3.1之后都放在 app/assets/之下
包括stylesheets javascript 和一些静态网页
关于Scripts
关于rails命令,第一个参数决定了rails要执行的功能
benchmarker
生成你的应用中 的 一个或多个方法的性能数
console
允许你和你的Rails应用中的方法交互
dbconsole
允许你直接通过命令行和数据库交互
destroy
移除通过generate命令自动生成的文件
generate
一个代码生成器工具。可以生成controllers,mailers,models,scaffolds,webservices.你也 可以在Rails网站上下载其他的生成器。不带参数的命令可以查看特定的生成器的使用方法
例如rails generate migration
new
生成Rails应用的代码
plugin
帮你安装和管理插件(扩展Rails功能)
profiler
描述运行时一个URI请求处理的简介信息
runner
在Web上下文之外运行一个项目内的方法。
server
启动web服务器
?
关于临时文件
在tmp文件夹重,你可一找到一些子目录关于缓存内容,sessions,sockets等。通常这些文件会被Rails自动清理。除非错误运行,你可能需要到这里查看并删除旧文件
?
关于第三方代码
vendor目录是第三方代码存放出。这些代码有两种来源
1>Rails安装插件到vendor/plugins中
2>你可以在vendor文件夹中安装Rails和所有的依赖。
如果你想使用系统版本的gems,可以删除vendor/cache目录
?
关于配置文件
config目录包含了配置Rails的文件
运行你的应用前,Rails加载并执行 config/enviroment.rb和config/application.rb.这两个文件建立的标准环境加载包含了一下文件夹(相对与你的项目根目录)
-app/controllers 目录和子目录
-app/models 目录和所有子目录(命名以下划线或小写字母开头)
-vendor目录和每个plugin下插件子目录中的lib目录
-app, app/helpers, app/mails, app/services, config, 和lib
以上目录一旦存在就会被加到加载路径中
另外,在enviroments目录下,你可以根据不同环境(开发,测试,产品)做不同的配置
depot> rails server -e development
depot> rails server -e test
depot> rails server -e production
你也可以创建自己的环境。在数据库配置文件增加一个单元,在config/enviroments重创建新的文件
详见rake doc:guides
?
命名约定
Rails的菜鸟们也许会对Rails对命名的自动处理感到困惑。例如在调用模型类Person时,Rails会到数据库中找到名为people的表。
这里被Rails使用的默认配置都可以通过再配置重写
?
驼峰标识,下划线,复数形式
ruby中约定,变量名使用小写字母,并且字母间用下划线分割;类和模块中无下划线,每个单词的第一个字母为大写(驼峰标识)。例如变量order_status,类名LineItem
Rails通过两种方式处理这种命名约定。首先,她假设数据库表的名称,比如变量名称,使用小写字母和下划线连接单词。她也假设表名称总是复数,这导致表名称如orders和third_parties
从另一方面讲,Rails假设文件名都是用下划线分割的小写字母组成
?
如图可见该约定规则:
在一般的ruby代码中在引用类和模块之前你需要使用require关键字来包含Ruby源文件。由于Rails知道文件名与类名间的关系,因而require常常是不需要的。
?
模块化Controllers
目前位置,我们的controllers都存在与app/controllers文件夹下。有时结构化该文件夹会带来更多便利。例如我们可以放于app/controllers/admin/,名为book_controller.rb。即,controller名的最后一部分可以解析为一个文件名如name_controller.rb,前面部分可以从app/controllers导航到该文件所在的目录.
设想我们的程序有两组controllers(admin/xxx和content/xxx)两个组都定义了book controller.即app/controller文件夹下的admin和content子目录里都有book_controller.rb文件,并且这两个controller文件里都有名为BookController的类。
处理这种问题,Rails假设app/controller的子目录里的controllers都是定义在Ruby的modules(模块)中的。因此,在admin中的类应该这样声明
class Admin::BookController < ActionController::Base # ... end?
?
同理,在Content模块:
class Content::BookController < ActionController::Base # ... end?
?
这些controllers的模板也应该在app/views的子文件夹中,如下相应的请求:
http://my.app/admin/book/edit/1234 可以请求到
app/views/admin/book/edit.html.erb
以上工作 你可以通过命令
myapp> rails generate controller Admin::Book action1 action2 ...