Ruby On Rails的目录结构

由于 .org 域名无法备案的问题,我们不得不将 Ruby Gems 镜像,Ruby 镜像的服务域名更换了一下:

  • https://gems.ruby-china.com
  • https://cache.ruby-china.com

之前是 .org ,背后还是一样的东西,仅仅更换域名

请大家使用的时候注意更换一下,并在自己公司内相互转告。

当然 .org 依然可以用,会有跳转(但一些复杂的场景会有点小问题)。

=======================================================================

一个具有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程序中的主目录,其中主要包括assets、channels、controllers(C)、helpers、jobs、mailers、models(M)、views(V)这几个文件夹。我们看到,rails程序中的MVC的文件夹都存放在app文件夹中,因此我们需要做的绝大多数工作都是在app文件夹中进行的。

app/assets:存放程序的静态资源,例如图片、JavaScript 和CSS; 

lib/assets:存放自己的代码库,或者共用代码库的静态资源;

vendor/assets:存放第三方的静态资源,例如 JavaScript 插件,或者 CSS 框架或者Gem包

app/assets/

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

javascript/application.js 中 //= require_tree . 加载所有js文件。

(stylesheets/application.css中   *= require_tree .

会把 app/assets/stylesheets 目录中的所有 CSS 文件(包含子目录中的文件)都引入应用的 CSS 文件。

*=require_self   会把application.css也加载进来 )

#在页面通过 content_for :javascript  调用同名 controller的js

<% content_for :javascript do 

     javascript_include_tag "#{controller_name}"

end %>

app/channels/

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

app/controllers/

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

class  XxxController  < ApplocationController

end

app/helpers/

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

module Xxxx

    def xx()

        ...

    end

end

您可以在类中嵌入模块。为了在类中嵌入模块,您可以在类中使用 include 语句:include modulename

 

app/jobs/

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

Active Job 是用来声明任务,并把任务放到多种多样的队列后台中执行的框架。从定期地安排清理,费用账单到发送邮件,任何事情都可以是任务。任何可以切分为小的单元和并行执行的任务都可以用 Active Job 来执行。

** Active Job 的目标**

主要是确保所有的 Rails 程序有一致任务框架,即便是以 “立即执行”的形式存在。

class Xxx < ActiveJob::Base

    def    perform

        Resque.enqueue(AqiDayWorker, 'aqi_day_corno')

    end

end

app/mailers/

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

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

app/models/

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

class Xxx < ActiveRecord::Base

 

end

app/views/

用命令生成controller时,即

rails g controller catalog

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

app/workers

在加入gem包 sidekiq和sidekit(不在支持sidekiq,换成 sidekiq-cron) 后会生成一个workers目录,此目录下主要是队列任务:

定时执行的任务

class SidekiqAlarmRuleWorker

           include Sidekiq::Worker

           include Sidetiq::Schedulable

            recurrence do

                    hourly.minute_of_hour(33)   #每小时33分钟的时候执行

            end

 

            def perform(*args)

                ...

            end

end

bin/


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

config/


config文件夹下主要包括environments/、initializers/、locales/这三个文件夹和若干文件,主要是存放对rails程序进行配置的文件。

下面对部分重要的文件夹及文件进行介绍。具体的配置内容见这里。

config/environments/

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

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

#设置数据库时间格式使用本机时间。

config.active_record.default_timezone = :local
config.time_zone = 'Beijing'

config/initializers/

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

在config/initializers /assets.rb 中加上js文件名,

config/boot.rb

配置rails程序的Bundler以及加载路径。

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

config/application.rb

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

config/environment.rb

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

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

config/routes.rb

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

规定了特定格式的URL请求到后端controller的action的分发规则

 ip:端口/rails/info/routes 可在web段页面查看全员url

config/database.yml

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

db/


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

rails dbconsole   进入项目所使用的数据库

db/migrate/

安装数据库

rails db:setup 任务用于创建数据库,加载数据库模式,并使用种子数据初始化数据库。

rails db:create   与  rails db:seed

重置数据库

rails db:reset 任务用于删除并重新创建数据库,其功能相当于 rails db:drop db:setup

运行指定迁移

要想运行或撤销指定迁移,可以使用 db:migrate:up 和 db:migrate:down 任务

rails db:migrate:up VERSION=20080906120000 RAILS_ENV=development (test 测试、 production 生产)

rails db:rollback  回滚

rake db:drop  #删除数据库

 

在创建表中字段时: 可以通过 , migration文件中 default: 默认值    来指定该字段的默认值

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

db/development.sqlite3

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

db/schema.rb

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

也许有人忘了提交。不过你依然可以使用rails db:schema:load  RAILS_ENV=development 创建表结构

db/seeds.rb

通过这个文件,可以直接把初始化数据存入数据库。(运行 bundle exec rake db:seed命令获得初始数据)

可以在这里写一些初始配置:比如新建用户(d_login_msgs),新建权限(s_role_msgs),主目录(s_func_msgs),权限目录关联表(s_role_funcs)

lib/


程序的扩展模块。

lib/assets/

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

lib/tasks/

rails generate task  命令会生成一个新的自定义任务文件。

Rake的任务一般存放在lib/tasks目录下。(可以新建一些rake 命令 通过 bundle exec rake -T 查看项目全部的Rake命令)

文件以 .rake 结尾

desc "I am short, but comprehensive description for my cool task"

task task_name: [:prerequisite_task:another_task_we_depend_ondo

  # 在这里定义任务

  # 可以使用任何有效的 Ruby 代码

end

log/


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

public/


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

test/


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

tmp/


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

tmp: 命名空间中的任务可以清理或创建 Rails.root/tmp 目录:

  • rails tmp:cache:clear 清空 tmp/cache 目录;
  • rails tmp:sockets:clear 清空 tmp/sockets 目录;
  • rails tmp:clear 清空所有缓存和套接字文件;
  • rails tmp:create 创建缓存、套接字和 PID 所需的临时目录;

vendor/


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

vendor/assets/

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

在config/application.rb中加上config.assets.enabled = true才会启用这个功能
> 最后在app/javascript/application.js中添加引用。
在第三方插件中创建一个 index.js 文件, //= require 所需js。

执行:

bundle install --path vendor/    # 把项目所需的gem 包安装到本项目中

 

config.ru


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

 

Gemfile 

 

group :development, :test do
  gem 'sqlite3', '1.3.13'
  gem 'byebug',  '9.0.6', platform: :mri

end

指定gem版本 只用于开发和测试环境


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

Gemfile.lock


命令:

bundle install

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

Rakefile


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

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

你可能感兴趣的:(Ruby On Rails的目录结构)