Ruby on Rails 学习(二)——Rails的目录结构

在学习rails时,我们有必要了解rails程序中的目录结构。
rails对于不同的文件,不同的代码存放在什么样的文件目录中有着明确要求。在rails中,有一条原则是:“惯例优于设置”(Convention Over Configuration),按照rails的约定去编程,往往能起到事半功倍的效果。
在这里,我们将对rails程序中的主要的文件及文件夹进行介绍。

一个具有MVC完整结构的目录结构

首先,我们来看一个rails程序的目录结构,这个目录具有完整的MVC结构。我们通过tree命令来查看程序的目录结构:

vito@vito-HP:~/rails/test_of_rails/catalog_demo$ tree
.
├── app
│   ├── assets
│   │   ├── config
│   │   │   └── manifest.js
│   │   ├── images
│   │   ├── javascripts
│   │   │   ├── application.js
│   │   │   ├── cable.js
│   │   │   ├── catalog.coffee
│   │   │   └── channels
│   │   └── stylesheets
│   │       ├── application.css
│   │       └── catalog.scss
│   ├── channels
│   │   └── application_cable
│   │       ├── channel.rb
│   │       └── connection.rb
│   ├── controllers
│   │   ├── application_controller.rb
│   │   ├── catalog_controller.rb
│   │   └── concerns
│   ├── helpers
│   │   ├── application_helper.rb
│   │   └── catalog_helper.rb
│   ├── jobs
│   │   └── application_job.rb
│   ├── mailers
│   │   └── application_mailer.rb
│   ├── models
│   │   ├── application_record.rb
│   │   ├── concerns
│   │   └── user.rb
│   └── views
│       ├── catalog
│       │   └── catalog_test.html.erb
│       └── layouts
│           ├── application.html.erb
│           ├── mailer.html.erb
│           └── mailer.text.erb
├── bin
│   ├── bundle
│   ├── rails
│   ├── rake
│   ├── setup
│   └── update
├── config
│   ├── application.rb
│   ├── boot.rb
│   ├── cable.yml
│   ├── database.yml
│   ├── environment.rb
│   ├── environments
│   │   ├── development.rb
│   │   ├── production.rb
│   │   └── test.rb
│   ├── initializers
│   │   ├── application_controller_renderer.rb
│   │   ├── assets.rb
│   │   ├── backtrace_silencers.rb
│   │   ├── cookies_serializer.rb
│   │   ├── filter_parameter_logging.rb
│   │   ├── inflections.rb
│   │   ├── mime_types.rb
│   │   ├── new_framework_defaults.rb
│   │   ├── session_store.rb
│   │   └── wrap_parameters.rb
│   ├── locales
│   │   └── en.yml
│   ├── puma.rb
│   ├── routes.rb
│   ├── secrets.yml
│   └── spring.rb
├── config.ru
├── db
│   ├── development.sqlite3
│   ├── migrate
│   │   └── 20161030073918_create_users.rb
│   ├── schema.rb
│   └── seeds.rb
├── Gemfile
├── Gemfile.lock
├── lib
│   ├── assets
│   └── tasks
├── log
│   └── development.log
├── public
│   ├── 404.html
│   ├── 422.html
│   ├── 500.html
│   ├── apple-touch-icon.png
│   ├── apple-touch-icon-precomposed.png
│   ├── favicon.ico
│   └── robots.txt
├── Rakefile
├── README.md
├── test
│   ├── controllers
│   │   └── catalog_controller_test.rb
│   ├── fixtures
│   │   ├── files
│   │   └── users.yml
│   ├── helpers
│   ├── integration
│   ├── mailers
│   ├── models
│   │   └── user_test.rb
│   └── test_helper.rb
├── tmp
│   └── cache
│       └── assets
└── vendor
    └── assets
        ├── javascripts
        └── stylesheets

46 directories, 69 files

Rubymine中程序的目录结构:

rails_catalog_all.png

下面我们将基于这个目录结构来介绍各个目录及文件。

app/


app目录是rails程序中的主目录,其中主要包括assetschannelscontrollers(C)helpersjobsmailersmodels(M)views(V)这几个文件夹。我们看到,rails程序中的MVC的文件夹都存放在app文件夹中,因此我们需要做的绝大多数工作都是在app文件夹中进行的。

app/assets/

通常放置我们自己为了自己的程序所写的js,css,或者是images文件,分别放在javascripts(js)stylesheets(CSS)images文件夹下。

app/channels/

Action Cable中的组件,Action Cable结合WebSockets来实现浏览器端实时的消息通知。一般情况下我们很少使用。

app/controllers/

rails程序中的控制器文件(controller层)一般都存放在这个文件夹下

app/helpers/

主要用来存放helper方法。在Rails中,Helper指的是可以在Template中使用的辅助方法,主要用途是可以将资料转化成输出用的HTML字串。每个控制器都可以有一个对应的Helper模块,它在app/helper目录下,与控制器文件同名。例如catalog_controller.rb对应的helper文件catalog_helper.rb。当我们希望一个helper方法是全局共享时,通常将该方法放在application_helper.rb中。

app/jobs/

用来存放任务文件,确保任务文件继承自 ActiveJob::Base即可。

Active Job 是用来声明任务,并把任务放到多种多样的队列后台中执行的框架。从定期地安排清理,费用账单到发送邮件,任何事情都可以是任务。任何可以切分为小的单元和并行执行的任务都可以用 Active Job 来执行。
** Active Job 的目标**
主要是确保所有的 Rails 程序有一致任务框架,即便是以 “立即执行”的形式存在。

app/mailers/

用来存放实现发送邮件功能的文件。

Rails 使用 Action Mailer 实现发送邮件功能,邮件由邮件程序和视图控制。邮件程序继承自 ActionMailer::Base,作用和控制器类似,保存在文件夹 app/mailers 中,对应的视图保存在文件夹 app/views 中。

app/models/

用来存放model文件(M层),例如user.rb文件,这个User模型对应一个名为users的table(表),一个模型最多只能对应一张表(可以不对应表)。

app/views/

用命令生成controller时,即

rails g controller catalog

会在app/views文件夹下生成对应的一个文件夹,文件夹名称与控制器名称相同,在此文件夹下即可生成对应控制器的视图文件,例如本例中的app/views/catalog/catalog_test.html.erb文件。

bin/


存放运行程序的 rails 脚本,以及其他用来部署或运行程序的脚本。

config/


config文件夹下主要包括environments/initializers/locales/这三个文件夹和若干文件,主要是存放对rails程序进行配置的文件。
下面对部分重要的文件夹及文件进行介绍。具体的配置内容见这里

config/environments/

rails程序的不同运行环境的配置包括:

  • config/environments/development.rb 开发环境配置文件
  • config/environments/test.rb 测试环境配置文件
  • config/environments/production.rb 生产环境配置文件

config/initializers/

加载完框架以及程序中使用的gem后,Rails会加载初始化脚本。初始化脚本是个Ruby文件,存储在程序的config/initializers文件夹中。初始化脚本可在框架和gem 载完成后做设置。

config/boot.rb

配置rails程序的Bundler以及加载路径。
保存并加载可在命令行中执行的任务。任务在 Rails 的各组件中定义。如果想添加自己的任务,不要修改这个文件,把任务保存在 lib/tasks 文件夹中。

config/application.rb

根据不同的启动环境(Rails.env)加载不同的rails gems, 配置应用程序。

config/environment.rb

执行所有启动程序(initializers)。

config/boot.rbconfig/application.rbconfig/environment.rb这三个文件都在启动整个rails环境时加载。

config/routes.rb

rails程序的路由文件,添加路由时需要在此文件中添加。

config/database.yml

用来配置rails程序连接数据库的文件,包括连接的数据库类型、数据库连接池限制数量等。

db/


存放当前数据库的模式,以及数据库迁移文件。

db/migrate/

用来存放数据库的迁移文件。

db/development.sqlite3

当前程序连接的数据库文件

db/schema.rb

这个文件用来记录当前迁移的版本编号,同时匹配最新的数据库结构。

db/seeds.rb

通过这个文件,可以直接把初始化数据存入数据库。

lib/


程序的扩展模块。

lib/assets/

通常是放置我们使用的插件中用到的assets。

lib/tasks/

Rake的任务一般存放在lib/tasks目录下。

log/


程序的日志文件。不同环境下会生成不同的日志文件,例如development.logproduction.logserver.logtest.log,我们在开发时的信息都写在development.log里,而测试时的log都写在test.log里。

public/


唯一对外开放的文件夹,其他人可以直接访问这个目录中的东西。在这里存放于框架不进行交互的资源文件或网页文件。与这个目录相对应,app目录中的内容是对外隐藏的。

test/


用于存放单元测试、功能测试及整合测试文件等测试文件。

temp/


临时文件,例如缓存,PID,会话文件。

vendor/


存放第三方代码。经常用来放第三方 gem。

vendor/assets/

通常是放置一些我们从别的地方借用的assets,比如说一些jquery插件。

config.ru


基于 Rack 服务器的程序设置,用来启动程序。

Gemfile


用来指定程序所需的gem依赖件,用于Bundler gem。

Gemfile.lock


命令:

bundle install

执行后生成的文件,用来记录当前使用的gem信息。依赖于Gemfile

Rakefile


保存并加载可在命令行中执行的任务。任务在 Rails 的各组件中定义。如果想添加自己的任务,不要修改这个文件,把任务保存在 lib/tasks 文件夹中。

这就是rails程序的目录结构,明确每一个文件夹及文件的功能,对后面rails的学习开发是至关重要的,毕竟rails是“惯例优于设置”的,不同功能的文件放在对应的文件夹下,才更符合rails的开发。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容