MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Ruby on Rails 框架入门

2022-11-232.1k 阅读

一、Ruby on Rails 框架简介

Ruby on Rails(通常简称为 Rails)是一个基于 Ruby 语言的开源 Web 应用程序框架,遵循模型 - 视图 - 控制器(Model - View - Controller,MVC)架构模式。它旨在使开发人员能够快速且高效地构建数据库驱动的 Web 应用程序,通过约定优于配置(Convention over Configuration,CoC)的原则,减少了开发过程中需要编写的样板代码数量。

Rails 的主要目标是提高开发人员的生产力,它提供了一套丰富的工具和库,用于处理 Web 开发中的常见任务,如数据库交互、路由、视图渲染等。这使得开发人员可以专注于业务逻辑的实现,而不必花费大量时间在底层的基础设施搭建上。

二、安装 Ruby on Rails

在开始使用 Rails 之前,需要先安装 Ruby 环境。Ruby 可以通过多种方式安装,以下以在 Ubuntu 系统上为例:

  1. 安装 Ruby
    sudo apt - get update
    sudo apt - get install ruby - full
    
  2. 安装 RubyGems:RubyGems 是 Ruby 的包管理器,用于安装和管理 Ruby 库和应用程序。在大多数情况下,安装 Ruby 时会一并安装 RubyGems。可以通过以下命令检查是否安装成功:
    gem - v
    
  3. 安装 Rails:使用 RubyGems 安装 Rails 框架。
    gem install rails
    

安装完成后,可以通过以下命令检查 Rails 版本:

rails - v

三、创建第一个 Rails 应用程序

  1. 生成新的 Rails 项目:使用 rails new 命令来创建一个新的 Rails 应用程序。假设我们要创建一个名为 myapp 的应用程序,可以在终端中执行以下命令:
    rails new myapp
    

这将在当前目录下创建一个名为 myapp 的新目录,其中包含了 Rails 应用程序的基本结构。

  1. 目录结构解析:进入 myapp 目录,可以看到以下主要目录和文件:

    • app:这个目录包含了应用程序的核心代码,包括控制器、模型、视图等。
      • controllers:存放控制器文件,负责处理 HTTP 请求并协调模型和视图。
      • models:包含应用程序的数据模型,用于与数据库交互。
      • views:存放视图文件,负责呈现用户界面。
    • config:包含应用程序的配置文件,如数据库配置、路由配置等。
    • db:存放数据库相关的文件,如迁移文件和种子数据文件。
    • Gemfile:列出了应用程序所依赖的 Ruby 库(gems)。
  2. 启动 Rails 服务器:在 myapp 目录下,使用以下命令启动 Rails 服务器:

    cd myapp
    rails server
    

启动成功后,可以在浏览器中访问 http://localhost:3000,将会看到 Rails 的欢迎页面,表明应用程序已成功启动。

四、Rails 中的模型(Model)

  1. 模型的概念:在 Rails 中,模型是应用程序的数据抽象,通常与数据库中的表相对应。每个模型都是一个继承自 ActiveRecord::Base 的 Ruby 类,ActiveRecord 是 Rails 提供的一个强大的对象关系映射(Object - Relational Mapping,ORM)库,它允许开发人员通过 Ruby 代码与数据库进行交互,而无需编写原始的 SQL 语句。

  2. 创建模型:假设我们要创建一个名为 User 的模型,用于表示应用程序中的用户。可以使用以下命令生成模型:

    rails generate model User name:string email:string
    

上述命令会在 app/models 目录下生成一个 user.rb 文件,并在 db/migrate 目录下生成一个迁移文件,用于创建数据库表。name:stringemail:string 表示 User 模型有两个属性,nameemail,数据类型都是字符串。

  1. 模型代码示例:打开 app/models/user.rb 文件,内容大致如下:
    class User < ApplicationRecord
    end
    

ApplicationRecord 是所有应用程序模型的基类,继承自 ActiveRecord::Base。可以在这个类中定义各种方法,如验证、关联等。

  1. 数据库迁移:迁移是 Rails 用于管理数据库结构变化的机制。在生成模型后,需要运行迁移来创建实际的数据库表。使用以下命令运行迁移:
    rails db:migrate
    

迁移成功后,数据库中会创建一个名为 users 的表,包含 nameemail 两个字段。

  1. 模型验证:为了确保数据的完整性,可以在模型中添加验证。例如,要确保 nameemail 字段不能为空,可以在 user.rb 文件中添加以下代码:
    class User < ApplicationRecord
      validates :name, presence: true
      validates :email, presence: true, format: { with: /\A[\w+\-.]+@[a - z\d\-.]+\.[a - z]+\z/i }
    end
    

上述代码中,validates :name, presence: true 表示 name 字段必须存在,validates :email, presence: true, format: { with: /\A[\w+\-.]+@[a - z\d\-.]+\.[a - z]+\z/i } 表示 email 字段必须存在且符合电子邮件格式。

五、Rails 中的控制器(Controller)

  1. 控制器的作用:控制器在 Rails 应用程序中扮演着中间人的角色,它接收来自客户端(通常是浏览器)的 HTTP 请求,处理请求相关的业务逻辑,调用模型获取或操作数据,然后选择合适的视图来呈现响应。

  2. 创建控制器:假设我们要创建一个名为 UsersController 的控制器,用于处理与用户相关的请求。可以使用以下命令生成控制器:

    rails generate controller Users
    

这将在 app/controllers 目录下生成一个 users_controller.rb 文件,并在 app/views 目录下创建一个 users 子目录,用于存放与 UsersController 相关的视图文件。

  1. 控制器代码示例:打开 app/controllers/users_controller.rb 文件,初始内容如下:
    class UsersController < ApplicationController
    end
    

ApplicationController 是所有应用程序控制器的基类,它提供了一些通用的功能和方法。我们可以在 UsersController 类中定义各种动作(action)方法,每个方法对应一个特定的 HTTP 请求。

例如,要定义一个 index 动作,用于显示所有用户列表,可以添加以下代码:

class UsersController < ApplicationController
  def index
    @users = User.all
  end
end

在上述代码中,User.all 从数据库中获取所有的 User 记录,并将其赋值给实例变量 @users。这个实例变量可以在对应的视图中使用。

六、Rails 中的视图(View)

  1. 视图的概念:视图负责将应用程序的数据呈现给用户。在 Rails 中,视图通常是使用 ERB(Embedded Ruby)模板编写的 HTML 文件,ERB 允许在 HTML 中嵌入 Ruby 代码,以便动态生成内容。

  2. 创建视图:对于 UsersControllerindex 动作,需要在 app/views/users 目录下创建一个 index.html.erb 文件。

  3. 视图代码示例:在 index.html.erb 文件中,可以编写如下代码来显示用户列表:

    <h1>User List</h1>
    <ul>
      <% @users.each do |user| %>
        <li><%= user.name %> - <%= user.email %></li>
      <% end %>
    </ul>
    

上述代码中,<h1>User List</h1> 是一个 HTML 标题,<ul></ul> 之间使用 ERB 循环遍历 @users 实例变量,为每个用户生成一个列表项,显示用户的 nameemail

七、路由(Routing)

  1. 路由的作用:路由在 Rails 应用程序中负责将传入的 HTTP 请求映射到相应的控制器动作。它定义了应用程序的 URL 结构,并决定了如何处理不同的请求。

  2. 路由定义:Rails 的路由定义在 config/routes.rb 文件中。例如,要将根路径(/)映射到 UsersControllerindex 动作,可以在 routes.rb 文件中添加以下代码:

    Rails.application.routes.draw do
      root 'users#index'
    end
    

上述代码中,root 表示根路径,users#index 表示 UsersController 中的 index 动作。

  1. 资源路由:Rails 提供了一种便捷的方式来定义 RESTful 风格的路由,称为资源路由。对于 User 模型,可以使用以下代码定义资源路由:
    Rails.application.routes.draw do
      resources :users
    end
    

这将自动为 User 模型生成一系列标准的 RESTful 路由,包括 index(列出所有用户)、show(显示单个用户)、new(创建新用户表单)、create(创建新用户)、edit(编辑用户表单)、update(更新用户)和 destroy(删除用户)等动作对应的路由。

八、数据库操作

  1. 数据库查询:在 Rails 中,可以使用 ActiveRecord 提供的方法进行数据库查询。例如,要获取所有用户,可以使用 User.all。要获取满足特定条件的用户,可以使用 where 方法,如 User.where(name: 'John') 获取名字为 John 的用户。

  2. 创建记录:可以使用 create 方法创建新的数据库记录。例如:

    user = User.create(name: 'Jane', email: 'jane@example.com')
    

上述代码创建了一个新的 User 记录,并将其保存到数据库中。

  1. 更新记录:要更新数据库中的记录,可以先获取记录,然后修改其属性并保存。例如:
    user = User.find(1)
    user.name = 'Updated Name'
    user.save
    

上述代码获取 id 为 1 的用户记录,修改其 name 属性,并保存更新。

  1. 删除记录:使用 destroy 方法删除数据库记录。例如:
    user = User.find(1)
    user.destroy
    

上述代码获取 id 为 1 的用户记录并将其从数据库中删除。

九、表单处理

  1. 生成表单:在 Rails 中,可以使用 form_with 辅助方法生成 HTML 表单。例如,在 app/views/users/new.html.erb 文件中,可以编写如下代码生成创建用户的表单:
    <%= form_with(model: @user, local: true) do |form| %>
      <div>
        <%= form.label :name %>
        <%= form.text_field :name %>
      </div>
      <div>
        <%= form.label :email %>
        <%= form.text_field :email %>
      </div>
      <%= form.submit %>
    <% end %>
    

上述代码中,form_with(model: @user, local: true) 表示表单基于 @user 模型,local: true 表示表单提交是本地提交,不进行 AJAX 提交。form.label 生成表单标签,form.text_field 生成文本输入框,form.submit 生成提交按钮。

  1. 处理表单提交:在 UsersController 中,需要定义 create 动作来处理表单提交。例如:
    class UsersController < ApplicationController
      def create
        @user = User.new(user_params)
        if @user.save
          redirect_to users_path, notice: 'User was successfully created.'
        else
          render :new
        end
      end
    
      private
      def user_params
        params.require(:user).permit(:name, :email)
      end
    end
    

在上述代码中,user_params 方法使用 params.require(:user).permit(:name, :email) 来获取并允许 nameemail 参数,防止参数注入攻击。@user = User.new(user_params) 创建一个新的 User 实例,@user.save 尝试将其保存到数据库。如果保存成功,重定向到用户列表页面并显示成功通知;如果保存失败,重新渲染 new 视图。

十、Rails 中的布局与视图助手

  1. 布局(Layout):布局是一种模板,用于定义应用程序的整体结构和外观。Rails 默认使用 app/views/layouts/application.html.erb 作为应用程序的布局文件。在布局文件中,可以包含 HTML 头部、导航栏、页脚等通用部分,以及一个 yield 方法,用于插入具体视图的内容。

例如,application.html.erb 文件可能如下:

<!DOCTYPE html>
<html>
<head>
  <title>My App</title>
  <%= csrf_meta_tags %>
  <%= csp_meta_tag %>
  <%= stylesheet_link_tag 'application', media: 'all', 'data - turbolinks - track': 'reload' %>
  <%= javascript_pack_tag 'application', 'data - turbolinks - track': 'reload' %>
</head>
<body>
  <header>
    <nav>
      <!-- 导航栏内容 -->
    </nav>
  </header>
  <%= yield %>
  <footer>
    <!-- 页脚内容 -->
  </footer>
</body>
</html>

上述代码中,<%= yield %> 位置会被具体视图的内容替换。

  1. 视图助手(Helpers):视图助手是一些方法,用于在视图中生成常用的 HTML 代码片段或执行一些辅助任务。例如,link_to 助手用于生成链接,image_tag 助手用于生成图片标签等。

例如,要生成一个指向用户详情页面的链接,可以在视图中使用以下代码:

<%= link_to user.name, user_path(user) %>

上述代码中,link_to 方法的第一个参数是链接显示的文本,第二个参数是链接的目标路径,user_path(user) 是 Rails 根据资源路由自动生成的路径,指向特定用户的详情页面。

十一、Rails 中的测试

  1. 测试的重要性:测试是软件开发过程中不可或缺的一部分,它可以帮助确保代码的正确性、稳定性和可维护性。Rails 提供了一套丰富的测试框架,包括单元测试、功能测试和集成测试等,方便开发人员为应用程序编写测试用例。

  2. 单元测试:单元测试主要用于测试模型和控制器的单个方法。以 User 模型为例,Rails 会在 test/models 目录下生成一个 user_test.rb 文件。可以在这个文件中编写测试用例,例如:

    require 'test_helper'
    
    class UserTest < ActiveSupport::TestCase
      test 'name should be present' do
        user = User.new(email: 'test@example.com')
        assert_not user.valid?
        assert user.errors[:name].any?
      end
    
      test 'email should be valid' do
        user = User.new(name: 'Test User', email: 'invalid - email')
        assert_not user.valid?
        assert user.errors[:email].any?
      end
    end
    

上述代码中,test 'name should be present' 测试了 name 字段必须存在的验证逻辑,test 'email should be valid' 测试了 email 字段的格式验证逻辑。

  1. 功能测试:功能测试用于测试控制器的动作和视图的渲染。以 UsersController 为例,Rails 会在 test/controllers 目录下生成一个 users_controller_test.rb 文件。可以编写如下测试用例:
    require 'test_helper'
    
    class UsersControllerTest < ActionDispatch::IntegrationTest
      test 'should get index' do
        get users_path
        assert_response :success
      end
    
      test 'should create user' do
        assert_difference('User.count') do
          post users_path, params: { user: { name: 'New User', email: 'new@example.com' } }
        end
        assert_redirected_to users_path
      end
    end
    

上述代码中,test 'should get index' 测试了 index 动作能否成功响应,test 'should create user' 测试了创建用户的功能,包括检查用户数量是否增加以及是否重定向到正确的路径。

  1. 集成测试:集成测试用于测试多个组件之间的交互,例如模型、控制器和视图之间的协作。Rails 提供了 ActionDispatch::IntegrationTest 类来编写集成测试。例如,可以编写测试用例来模拟用户在浏览器中的操作流程,测试整个应用程序的功能是否正常。

十二、部署 Rails 应用程序

  1. 选择部署平台:常见的 Rails 应用程序部署平台有 Heroku、AWS Elastic Beanstalk、DigitalOcean 等。这里以 Heroku 为例进行介绍。

  2. 准备部署:在部署之前,需要确保应用程序在本地运行正常,并且所有依赖项都已正确配置。在 Gemfile 文件中,确保列出了所有必要的 gems,并且运行 bundle install 安装这些依赖项。

  3. 部署到 Heroku

    • 首先,需要在 Heroku 官网创建一个账户,并安装 Heroku CLI。
    • 登录 Heroku CLI:
      heroku login
      
    • 在 Rails 应用程序目录下,初始化 Git 仓库(如果尚未初始化):
      git init
      git add.
      git commit - m "Initial commit"
      
    • 创建一个 Heroku 应用:
      heroku create
      
    • 将代码推送到 Heroku:
      git push heroku master
      
    • 运行数据库迁移:
      heroku run rails db:migrate
      
    • 打开应用:
      heroku open
      

通过以上步骤,就可以将 Rails 应用程序部署到 Heroku 平台上,并通过 Heroku 提供的 URL 访问应用程序。

通过以上对 Ruby on Rails 框架各个方面的介绍,相信你已经对如何使用 Rails 开发 Web 应用程序有了较为全面的了解。在实际开发中,还可以进一步探索 Rails 的更多高级特性,如 Action Cable 实现实时通信、ActiveJob 进行异步任务处理等,以构建更强大、高效的 Web 应用程序。