ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Rails组成与项目结构 Ruby on Rails框架是基于REST和MVC架构思想来设计的,那么让我们先看看Rails的组成结构,了解它是怎么实现这些思想的。 ### Rails组成 当你用gem install rails命令安装Rails,你会发现它安装了很多的组件: 可以用gem list查看,这里把Rails核心组件列出来,其他的依赖就不说了。 ~~~ actionmailer actionpack actionview activemodel activerecord activeresource activesupport rails railties ~~~ 1. actionmailer 专门提供email发送服务的一个框架。 1. actionpack 包含了action dispatch ,action controller和 action view,用于Rails中控制器、路由和view层的交互。 1. actionview Rails4 中,从actionpack中独立出来,所以上面的actionpack在Rails4中只剩下action dispatch和action controller了。 1. activemodel 独立于activerecord,处理model层的数据验证等逻辑,非数据存储,可以算是ORM的一个前端,你可以用它实现自己的ORM,比如开源的一个mongodb orm:mongoid 1. activerecord 实现了零配置将Ruby类映射到数据库,我们用它来和数据库进行交互,它依赖于active model。 1. activeresource Rails4已经移除,Rails3中,用于消费REST api。 1. activesupport active support 中包含了一组工具类,以及对Ruby标准库的各种扩展,主要是为了给rails提供支持。 rails的其他组件都依赖于active support组件。 1. rails & railties 上面的activerecord,actionpack,activesupport,activemodel,actionview,actionmailer都是gem形式存在,而rails是包含了它们这些组件的一个总的gem。 railties是用于粘合这些组件相互协同工作的组件,并且它还提供了生成器和rails的各种命令。 ### 约定大于配置 Rails的一个先进理念,就是约定大于配置。也是Rails的核心原则,也是Raila开发效率提升的关键。 在Rails实现这个理念的若干年后,其他Web开发框架才反应过来,纷纷表示自己实现了约定大于配置。 那么约定大于配置在Rails中表现在哪? - 数据库表名和model名单复数约定 比如: model是User, 那么Rails就会去找users表。 model是单数,数据库表是复数。 - 类名、模块名和文件查找 比如: 类名是User, 那么它一定对应文件名是user.rb。模块名是 Admin::User, 那么它一定对应于admin/user.rb文件。 通过这些约定,我们就省了不少配置,几乎达到了零配置。用JavaEE框架做过项目的朋友应该可以明白配置的痛苦。 - controller会默认渲染对应名字的view 比如: controllers/users_controller 会自动的渲染 views/users.html.erb 这样的view文件。 - RESTful: controller里面的action 默认响应HTTP 方法 比如: - GET /users 会自动响应 index action - PUT|PATCH /users/1 会自动响应 update action - POST /users 会自动响应 create action - DELETE /users/1 会自动响应 delete action - Migration 数据迁移脚本 比如:你创建一个数据迁移脚本 xxx_create_users.rb ,rails会根据这个名字帮你生成脚本文件。 稍后我们会见识到。 理解Rails的约定大于配置原则,对你Rails的学习有很大帮助。 ### Rails项目结构 我们使用rails new 命令创建一个新项目: ~~~ rails new reading ~~~ 你也可以用指定版本号来创建一个项目: ~~~ rails _3.2.18_ new reading ~~~ *当然,我们安装好Chef Server自动就已经有这个项目了。* 一个默认的Rails(3.2.18)项目的目录结构如下: ~~~ app/ |_ assets/ |_ controllers/ |_ helpers/ |_ mailers/ |_ models/ |_ views/ config/ |_ application.rb |_ database.yml |_ environments/ |_ locales/ |_ boot.rb |_ environment.rb |_ initializers/ |_ routes.rb config.ru db/ |_ seeds.rb doc/ |_ README_FOR_APP Gemfile Gemfile.lock .gitignore lib/ |_ assets/ |_ tasks/ log/ public/ |_ 404.html |_ 422.html |_ 500.html |_ robots.txt Rakefile README.rdoc script/ |_ rails test/ |_ fixtures/ |_ functional/ |_ integration/ |_ performance/ |_ test_helper.rb |_ unit/ tmp/ |_ cache vendor/ |_ assets/ |_ plugins/ ~~~ Rails 4.1 的项目结构有所变化: script目录变成了bin,config里多了secret.yml ~~~ app/ |_ assets/ |_ controllers/ |_ helpers/ |_ mailers/ |_ models/ |_ views/ bin/ |_ bundle |_ rails |_ rake config/ |_ application.rb |_ database.yml |_ environments/ |_ locales/ |_ secrets.yml |_ boot.rb |_ environment.rb |_ initializers/ |_ routes.rb config.ru db/ |_ seeds.rb doc/ |_ README_FOR_APP Gemfile Gemfile.lock .gitignore lib/ |_ assets/ |_ tasks/ log/ public/ |_ 404.html |_ 422.html |_ 500.html |_ robots.txt Rakefile README.rdoc test/ |_ fixtures/ |_ functional/ |_ integration/ |_ performance/ |_ test_helper.rb |_ unit/ tmp/ |_ cache vendor/ |_ assets/ |_ plugins/ ~~~ 虽然Rails3和Rails4的目录结构有一点变化,但总的思想是不变的。 Chef11 的server webui目前是Rails3写的,所以我们看Rails3就够用了。 ### app目录 - app目录的作用是组织REST架构和MVC架构的相关代码。也是Rails项目启动文件默认加载的目录。 - assets 目录:包含了前端的资源,javascript、css、images。 - controllers目录:包含了所有的controller,在Rails中一般controller就是指REST架构中的资源。controller里实现了各种action,用于响应web请求。 也是MVC架构中的C层。 - helpers目录: 用于存放一些helper方法,这些helper方法一般用在view层,用于组织一些用于view的逻辑代码。 - mailers目录: 用于放和邮件发送相关的代码。 - models目录: 用于放各种数据库映射的model,一些数据操作以及业务逻辑代码,都应该放在这里。 MVC架构中的M层。 - views目录: 用于放views层的模板,经过controller渲染这些模板,最后生成可供用户访问的页面。MVC架构中的V层。 ### bin目录 (或Rails3 中的script目录) Rails的命令,以及bundle、rake命令。 ### config目录 这里配置Rails项目的运行规则。 - application.rb 文件,用于配置你的Rails项目运行的各种参照、状态。 - database.yml 文件用于配置你的数据库连接驱动及信息。 - boot.rb 用于load bunler环境,加载依赖gem - environment.rb 初始化Rails应用 environments目录,包含了Rails预设的三种状态,development、production、test。 这三种状态,对应不同的环境,development为开发环境,production为生产环境,test为测试环境。 我们开发的时候一般用development环境,部署到线下,需要用production环境, 做单元测试的时候,就是用测试环境。 这三种环境对应的rails应用的配置有所不同。 - locales 这个目录包含用于国际化的yml配置文件。 - secrets.yml 这个文件默认存有应用程序的 secret_key_base,也可以用来存放其它 secrets,比如存放外部 API 需要用的 access keys。 - initializers 目录,这个目录存放着一些rails的启动文件,这些文件是rails默认对外开放,意味着你可以在里面添加一些东西,来改变rails的启动状态。你还可以在这个文件夹下面放置你自己的启动文件。 - routes.rb, 这个文件是Rails中最重要的一个文件之一,因为这个文件中指定了你项目所有的路由配置,也就是说,所有的web请求收发规则,都由这里指定。 config.ru 文件, rackup启动所需要的一个配置文件 ### db 目录 这个目录存放的东西,主要是数据库相关。 seeds.rb 用于初始化应用数据。 将来用于创建数据库表结构的migration脚本文件,也会放到这个目录下面。 以及创建完数据库表生成的schema文件。 ### Gemfile 这个是bundler工具提供的,管理项目中用到的gem依赖。Rails启动应用会先从这个文件中加载。 bundle install 命令,帮助你安装所有的gem依赖。 然后会生成一个Gemfile.lock文件。 ### lib目录 用于存放第三方库。 tasks目录,用于存放rake 任务。 assets目录,用于存放我们自己代码库或者共用代码的静态资源。 ### public 这个目录用于web服务器,而非应用服务器,这个目录作为web服务器的根目录。 ### 其他目录 doc目录,用于存放项目的文档。 vendor目录,用于存放第三方资源,assets和plugins。 log目录, 日志输出的目录。 tmp 目录,用来存放暂时用途的文件,比如文件上传的临时文件等。 .gitignore 此文件用于配置不想或不能加入到git版本控制系统中的文件,比如database.yml , secrets.yml文件等。