`
genius_45
  • 浏览: 57915 次
  • 性别: Icon_minigender_1
  • 来自: 威海
社区版块
存档分类
最新评论

翻译《应用Rails进行敏捷Web开发(第四版)》(一)

阅读更多

 

深入理解Rails

 

P257 -- P270

 

目录结构

使用rails new my_app新建项目

 

-config.ru

用于配置Rack WebServer Interface,也可以创建Rails Metal应用,或在该Rails项目中使用Rails Middlewares.详见rails guide

 

        Rails很有趣的一点是她的组织形式。从一个开发者的视角,你的大部分时间是放在高层次的模块上,例如Active RecordAction View。另外有个叫Rails的组建,但是她位于其他的组件之下,默默的协调其他组建,让她们合作无间。同时,这个底层结构很少会被使用到,本节末会提到组件。

 

-Gemfile

用于定制你的Rails项目的依赖,这种依赖也包括数据库,web服务器甚至用于部署的脚本

技术上来讲,该文件是被你的应用所用,你可以在 config/boot.rbconfig/application.rb中找到对于Bundler的调用

-Rakefile

定义一些任务包括:运行测试,生成文档,抽取当前项目结构等。在命令行中可以输入以下命令:

rake -–tasks 查看命令清单

rake –describe task 更完整的关于task的使用介绍

 

-README

 

关于文档

 

Rails提供了doc:app Rake任务来生成文档到doc/下。另外docrails命令可以生成当前版本的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文件夹重,你可一找到一些子目录关于缓存内容,sessionssockets等。通常这些文件会被Rails自动清理。除非错误运行,你可能需要到这里查看并删除旧文件

 

关于第三方代码

vendor目录是第三方代码存放出。这些代码有两种来源

1>Rails安装插件到vendor/plugins

2>你可以在vendor文件夹中安装Rails和所有的依赖。

如果你想使用系统版本的gems,可以删除vendor/cache目录

 

关于配置文件

config目录包含了配置Rails的文件

运行你的应用前,Rails加载并执行 config/enviroment.rbconfig/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通过两种方式处理这种命名约定。首先,她假设数据库表的名称,比如变量名称,使用小写字母和下划线连接单词。她也假设表名称总是复数,这导致表名称如ordersthird_parties

从另一方面讲,Rails假设文件名都是用下划线分割的小写字母组成

 

如图可见该约定规则:


在一般的ruby代码中在引用类和模块之前你需要使用require关键字来包含Ruby源文件。由于Rails知道文件名与类名间的关系,因而require常常是不需要的。

 

模块化Controllers

目前位置,我们的controllers都存在与app/controllers文件夹下。有时结构化该文件夹会带来更多便利。例如我们可以放于app/controllers/admin/,名为book_controller.rb。即,controller名的最后一部分可以解析为一个文件名如name_controller.rb,前面部分可以从app/controllers导航到该文件所在的目录.

设想我们的程序有两组controllersadmin/xxxcontent/xxx)两个组都定义了book controller.app/controller文件夹下的admincontent子目录里都有book_controller.rb文件,并且这两个controller文件里都有名为BookController的类。

处理这种问题,Rails假设app/controller的子目录里的controllers都是定义在Rubymodules(模块)中的。因此,在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 ...

  • 大小: 27.3 KB
1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics