Skip to content

Ruby on Rails - 目录结构

当您使用 rails new <app_name> 命令创建新的 Rails 应用程序时,Rails 会生成一个标准目录结构。此约定是 Rails 开发的基石,有助于促进一致性,并使导航和理解不同的 Rails 项目变得更容易。

让我们探究一下现代 Rails 应用程序典型的顶级目录结构,例如使用 rails new my_app 创建的应用:

运行 rails new my_app 后,您将进入应用程序的根目录:

$ cd my_app
$ ls # or 'dir' on Windows

您会找到一系列目录和文件。以下是最重要目录和文件的概览:

  • app/:这是应用程序大部分特定代码所在的地方。它是 Rails 项目的核心。
    • app/assets/:包含静态资源 (static assets),如样式表 (app/assets/stylesheets/)、图片 (app/assets/images/),以及可能的自定义字体。Rails 的资源管道 (asset pipeline) 处理这些文件。
    • app/channels/:用于 Action Cable,支持 WebSockets 的实时功能。
    • app/controllers/:存放控制器 (controller) 类。控制器处理 Web 请求,与模型 (model) 交互,并选择视图 (view) 进行渲染。
    • app/helpers/:包含助手 (helper) 模块,这些模块提供视图中可用的实用方法 (utility methods),以保持视图逻辑的整洁。
    • app/javascript/:(常见于现代 JS 打包工具 (JS bundling),如 esbuild 或 Webpacker)包含 JavaScript 代码,通常组织成 packs 或 components。
    • app/jobs/:用于 Active Job,用于定义可由队列后端处理的后台作业 (background jobs)。
    • app/mailers/:存放 Action Mailer 类,用于发送电子邮件。
    • app/models/:包含 Active Record 模型 (model) 类,它们代表应用程序的数据和业务逻辑。
    • app/views/:存放视图 (view) 模板(例如,ERB 文件)。它们根据相应的控制器 (controller) 组织成子目录。
  • - **`app/views/layouts/`**:包含布局文件 (layout files),这些文件定义视图的通用结构(例如,页眉和页脚)。
  • bin/:包含应用程序的可执行脚本 (executable scripts),包括:
    • bin/rails:Rails 任务的主要命令行界面 (command-line interface)(例如,启动服务器 (server)、运行生成器 (generators)、迁移 (migrations))。
    • bin/bundle:Bundler 的一个 binstub,确保使用正确的 gem 版本。
    • bin/setup:用于首次设置应用程序的脚本(例如,安装依赖项 (dependencies)、创建数据库 (database)、运行迁移 (migrations))。
    • bin/dev:(在新版本 Rails 中)启动开发服务器 (development servers) 的脚本(例如,Rails server、JS 打包工具、CSS watcher)。
  • config/:包含应用程序的配置文件 (configuration files)。
    • config/application.rb:核心应用程序配置。
    • config/database.yml:数据库连接设置。
    • config/environment.rb:Rails 环境加载点。
    • config/environments/:特定环境的配置(development.rb、test.rb、production.rb)。
    • config/initializers/:应用程序启动时运行的 Ruby 文件,用于配置 gem 或框架设置。
    • config/locales/:国际化 (i18n) 翻译文件。
    • config/routes.rb:定义应用程序的 URL 到控制器 (controller) 动作 (action) 映射。
  • db/:包含数据库相关文件。
    • db/migrate/:存放数据库迁移文件 (migration files),这些文件允许您随时间演进数据库模式 (database schema)。
    • db/schema.rb:当前数据库模式 (database schema) 的表示,由 Rails 自动生成。
    • db/seeds.rb:用于使用初始或示例数据填充数据库的脚本。
  • lib/:存放您自己的库代码 (library code),不适合放入 app/ 中。
    • lib/assets/:资源管道 (asset pipeline) 的额外资源。
    • lib/tasks/:自定义 Rake 任务。
  • log/:包含不同环境的日志文件 (log files)(例如,development.log、production.log)。
  • public/:包含由 Web 服务器直接提供的静态文件 (static files)(例如,错误页面,如 404.html、500.html、robots.txt)。
  • storage/:(由 Active Storage 使用)如果未使用云服务,用于本地存储上传文件。
  • test/:包含应用程序的测试(例如,单元测试 (unit tests)、集成测试 (integration tests)、系统测试 (system tests))。
    • test/fixtures/:测试的示例数据。
    • test/controllers/ 等。
  • tmp/:存放临时文件 (temporary files)(例如,缓存 (cache)、会话数据 (session data)、进程 ID (PIDs))。
  • vendor/:用于不通过 Bundler 管理的第三方代码(现在很少用于 JavaScript 或 CSS,因为这些通过 app/javascript 或资源管道 (asset pipeline) 和 npm/yarn 等包管理器 (package managers) 处理)。

根目录中的关键文件:

  • Gemfile:列出应用程序的 gem 依赖项 (dependencies),由 Bundler 管理。
  • Gemfile.lock:记录使用的所有 gem 的确切版本,确保环境一致。
  • Rakefile:定义 Rake 任务,尽管许多常见任务现在可以通过 bin/rails 获得。
  • README.md:一个 Markdown 文件,您应该在其中描述您的应用程序、设置说明等。
  • config.ru:Rackup 文件,由基于 Rack 的服务器用于启动应用程序。

这种标准化结构是 Rails 的一个显著优势,使开发者能够快速理解项目布局并有效协作。