【Ruby】Web框架ruby on rails初识(MVC架构初理解)

【Ruby】Web框架ruby on rails初识(MVC架构初理解)

1.安装与配置

1.1. 安装Ruby

首先,你需要安装Ruby。推荐使用Ruby版本管理工具RVM(Ruby Version Manager)或rbenv,但在Windows上这些工具的安装和支持可能不如在Linux或macOS上那样直接。因此,最简单的方式可能是直接下载RubyInstaller。

  • 访问 Ruby官网 下载适合Windows的Ruby安装包。
  • 运行安装程序并按照提示完成安装。

1.2. 安装Rails

一旦Ruby安装完毕,你可以通过Ruby的包管理器gem来安装Rails。

打开命令提示符(cmd.exe)或PowerShell,然后执行以下命令来安装Rails:

gem install rails

1.3. 配置环境

确保你的PATH环境变量包含Ruby和Rails的可执行文件路径。通常安装Ruby时会自动设置这一点,但如果不行,你可能需要手动添加。

2.Gem 和 Bundle

在开始项目之前需要了解这两个重要的概念

2.1.Gem

Gem 是 Ruby 的包管理系统。它允许开发者轻松地安装、管理和使用各种 Ruby 库(称为“gems”)。通过 Gem,你可以访问大量的开源软件库,这些库提供了各种功能,从数据库适配器到开发工具等等。Gem 命令行工具可以帮助你安装、查询、卸载和更新 gems。

常见的 Gem 命令:
  • gem install [gem_name]:安装一个 gem。
  • gem uninstall [gem_name]:卸载一个 gem。
  • gem list:列出已安装的 gems。
  • gem update [gem_name]:更新一个 gem 到最新版本。
  • gem sources -a https://gems.github.com/:添加 gem 仓库源。

2.2.Bundle

Bundle 是 Ruby 社区广泛使用的一个工具,它帮助开发者管理项目的依赖关系。当你在一个 Rails 项目中工作时,你会经常看到 Gemfile 文件。这个文件列出了项目所需的 gems 及其版本号。Bundle 工具读取 Gemfile 并确保所有必要的 gems 都被正确安装。

常见的 Bundle 命令:
  • bundle install:根据 GemfileGemfile.lock 文件安装所有必需的 gems。
  • bundle update [gem_name]:更新指定的 gem 到最新版本,并修改 Gemfile.lock 文件。
  • bundle add [gem_name]:向 Gemfile 添加一个新的 gem,并自动运行 bundle install
  • bundle exec [command]:运行一个命令,并确保在 bundle 创建的环境中执行,这样可以确保使用正确的 gem 版本。

区别

  • Gem 是一个通用的包管理工具,用于安装和管理 Ruby 的所有库。
  • Bundle 是一个特定于项目的工具,它使用 Gemfile 来管理项目的依赖项,并确保所有团队成员都使用相同的 gems 版本。

通俗地讲,gem类似于python中的pip,而bundle类似于java中的maven

maven在下载依赖的时候,由于下载速度的原因,通常需要使用国内的镜像来加速。bundle也是一样的

通过项目示例,你会对这两个概念有着更深的理解

3.为bundle配置国内镜像

在命令行上运行该命令为bundle配置Ruby China 镜像

bundle config --global mirror.https://rubygems.org/ https://gems.ruby-china.com/

使用以下命令来验证镜像源是否已经正确设置:

bundle config --global mirror.https://rubygems.org/

4.项目示例

4.1.创建项目

创建一个rails项目(Ruby on rails默认使用的数据库是SQLite)

在这里插入图片描述

点击create后会看到以下效果

在这里插入图片描述

前面是创建项目所需要的文件,后面是bundle在安装所需要的gems,正是因为配置了国内的镜像,安装速度还是比较快的

4.2.项目结构

!划横线的部分比较重要

核心目录结构
  1. app:存放应用的主要代码,分为多个子目录。
    • controllers:控制器文件,处理HTTP请求并调用模型和视图。
    • models:模型文件,代表数据库中的表,封装了业务逻辑。
    • views:视图文件,HTML模板文件,用于展示数据。
    • helpers:辅助模块,提供视图中使用的辅助方法。
    • mailers:邮件发送器,用于生成和发送电子邮件。
    • channels:WebSocket通道,用于实时通信。
    • jobs:后台任务,异步执行的任务。
    • assets:静态资源,如CSS、JavaScript文件。
  2. config:配置文件,包含应用的设置。
    • application.rb:应用的主要配置文件。
    • database.yml:数据库配置文件。
    • routes.rb:路由配置文件,定义URL与控制器动作之间的映射。
    • environments:不同环境(如development、test、production)的配置文件。
  3. db:数据库相关文件。
    • migrate:迁移文件,用于创建和修改数据库模式。
    • seeds.rb:种子数据,用于填充数据库以方便开发和测试。
  4. lib:库文件,存放自定义的类、模块等。
  5. log:日志文件,记录应用运行时的信息。
  6. public:公共资源文件,如index.html、robots.txt等,这些文件不会经过Rails的中间件处理。
  7. tmp:临时文件,如缓存文件、会话文件等。
  8. vendor:供应商文件,存放第三方库或gem。
其他重要文件
  1. Gemfile:列出项目所需的gems及版本。
  2. Gemfile.lock:锁定gems的具体版本,确保所有开发者使用相同版本的gems。
  3. Rakefile:定义了各种Rake任务。
  4. README.md:项目的文档,介绍项目的基本信息。
  5. .gitignore:Git忽略文件,告诉Git哪些文件不需要跟踪。
  6. config.ru:Rack配置文件,用于启动Rails应用。
  7. Procfile:Heroku部署配置文件,定义应用启动所需的进程类型。
  8. Guardfile:Guard的配置文件,用于自动化测试和开发任务。
  9. .ruby-version:指定项目所需的Ruby版本。

4.3.利用脚手架快速搭建一个有着CRUD功能的网站

我们只需要两条命令,就可以搭建出一个简单的学生管理系统的网站

1. 创建模型

!命令须在项目目录下运行

运行

rails generate scaffold Student name:string gender:string age:integer student_class:string student_number:integer

出现以下效果

在这里插入图片描述

这条命令会做以下几件事:

  • 创建一个名为 Student 的模型,包含以下字段:
    • name:字符串类型,表示学生的名字。
    • gender:字符串类型,表示学生的性别。
    • age:整数类型,表示学生的年龄。
    • class:字符串类型,表示学生的班级。
    • student_number:整数类型,表示学生的学号。
  • 自动生成 app/models/student.rb 文件。
  • 自动生成 app/controllers/students_controller.rb 文件。
  • 自动生成 app/views/students 目录下的视图文件。
  • 自动生成 db/migrate 目录下的迁移文件。
  • 自动生成 config/routes.rb 中的路由配置。
2. 迁移数据库

执行数据库迁移,在数据库中创建 students 表:

rails db:migrate

在这里插入图片描述

就这两条命令,我们就已经搭建好了一个简单的学生管理网站

运行下面的命令启动该项目

rails s

之后访问http://127.0.0.1:3000/students,会看到以下效果

在这里插入图片描述

我们可以对其进行增删改查

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


我们之后可以为其增添一些CSS样式让这个网站变得更加美观。

这些数据在哪里?

在storage目录下的sqlite中

在这里插入图片描述

在这里插入图片描述

4.MVC架构的体现

当使用Ruby on Rails的脚手架(scaffold)创建一个新模型时,它会自动生成一系列文件,包括模型、控制器、视图以及迁移文件等,这些文件共同构成了一个完整的MVC(Model-View-Controller)架构。下面通过一个具体的例子来说明如何使用脚手架创建一个学生模型,并解释在这一过程中MVC的体现。

1. 创建模型

假设我们需要创建一个学生模型,包含姓名、性别、年龄、班级和学号。我们可以使用脚手架命令来快速生成所需的文件:

rails generate scaffold Student name:string gender:string age:integer class:string student_number:integer

这条命令会生成以下文件和目录结构:

  • 模型app/models/student.rb
  • 控制器app/controllers/students_controller.rb
  • 视图app/views/students
  • 迁移db/migrate/xxxxxx_create_students.rb
  • 路由config/routes.rb
2. 模型(Model)

模型文件 app/models/student.rb 包含了学生表的定义和相关业务逻辑。

示例内容
# app/models/student.rb
class Student < ApplicationRecord
  validates :name, presence: true
  validates :gender, presence: true
  validates :age, presence: true, numericality: { only_integer: true }
  validates :class, presence: true
  validates :student_number, presence: true, numericality: { only_integer: true }
end

模型定义了表结构,并添加了一些验证规则来保证数据的有效性。

3. 控制器(Controller)

控制器文件 app/controllers/students_controller.rb 负责处理来自用户的请求,并调用模型和视图来完成业务逻辑。

示例内容
# app/controllers/students_controller.rb
class StudentsController < ApplicationController
  def index
    @students = Student.all
  end

  def show
    @student = Student.find(params[:id])
  end

  def new
    @student = Student.new
  end

  def create
    @student = Student.new(student_params)
    if @student.save
      redirect_to @student
    else
      render 'new'
    end
  end

  def edit
    @student = Student.find(params[:id])
  end

  def update
    @student = Student.find(params[:id])
    if @student.update(student_params)
      redirect_to @student
    else
      render 'edit'
    end
  end

  def destroy
    @student = Student.find(params[:id])
    @student.destroy
    redirect_to students_path
  end

  private

  def student_params
    params.require(:student).permit(:name, :gender, :age, :class, :student_number)
  end
end

控制器定义了处理各种HTTP请求的方法,例如显示所有学生列表(index)、显示单个学生详情(show)、创建新学生(create)、编辑学生信息(update)以及删除学生(destroy)等。

4. 视图(View)

视图文件位于 app/views/students 目录下,负责呈现数据给用户。

示例内容
  • index.html.erb:显示所有学生的列表。

    <!-- app/views/students/index.html.erb -->
    <h1>Students</h1>
    
    <table>
      <thead>
        <tr>
          <th>Name</th>
          <th>Gender</th>
          <th>Age</th>
          <th>Class</th>
          <th>Student Number</th>
          <th colspan="3"></th>
        </tr>
      </thead>
      <tbody>
        <% @students.each do |student| %>
          <tr>
            <td><%= student.name %></td>
            <td><%= student.gender %></td>
            <td><%= student.age %></td>
            <td><%= student.class %></td>
            <td><%= student.student_number %></td>
            <td><%= link_to 'Show', student %></td>
            <td><%= link_to 'Edit', edit_student_path(student) %></td>
            <td><%= link_to 'Destroy', student, method: :delete, data: { confirm: 'Are you sure?' } %></td>
          </tr>
        <% end %>
      </tbody>
    </table>
    
    <br>
    
    <%= link_to 'New Student', new_student_path %>
    
  • show.html.erb:显示单个学生的详细信息。

    <!-- app/views/students/show.html.erb -->
    <h1>Student Details</h1>
    <p>Name: <%= @student.name %></p>
    <p>Gender: <%= @student.gender %></p>
    <p>Age: <%= @student.age %></p>
    <p>Class: <%= @student.class %></p>
    <p>Student Number: <%= @student.student_number %></p>
    
    <br>
    
    <%= link_to 'Edit', edit_student_path(@student) %> |
    <%= link_to 'Back', students_path %>
    
  • new.html.erb:创建新学生的表单。

    <!-- app/views/students/new.html.erb -->
    <h1>New Student</h1>
    
    <%= form_with(model: @student, local: true) do |form| %>
      <div>
        <%= form.label :name %>
        <%= form.text_field :name %>
      </div>
    
      <div>
        <%= form.label :gender %>
        <%= form.text_field :gender %>
      </div>
    
      <div>
        <%= form.label :age %>
        <%= form.number_field :age %>
      </div>
    
      <div>
        <%= form.label :class %>
        <%= form.text_field :class %>
      </div>
    
      <div>
        <%= form.label :student_number %>
        <%= form.number_field :student_number %>
      </div>
    
      <div>
        <%= form.submit %>
      </div>
    <% end %>
    
  • edit.html.erb:编辑现有学生的表单。

    <!-- app/views/students/edit.html.erb -->
    <h1>Edit Student</h1>
    
    <%= form_with(model: @student, local: true) do |form| %>
      <div>
        <%= form.label :name %>
        <%= form.text_field :name %>
      </div>
    
      <div>
        <%= form.label :gender %>
        <%= form.text_field :gender %>
      </div>
    
      <div>
        <%= form.label :age %>
        <%= form.number_field :age %>
      </div>
    
      <div>
        <%= form.label :class %>
        <%= form.text_field :class %>
      </div>
    
      <div>
        <%= form.label :student_number %>
        <%= form.number_field :student_number %>
      </div>
    
      <div>
        <%= form.submit %>
      </div>
    <% end %>
    
5. 路由(Routing)

路由文件 config/routes.rb 定义了URL到控制器动作的映射。

示例内容
# config/routes.rb
Rails.application.routes.draw do
  resources :students
  root 'students#index'
end

这段代码为 students 资源定义了标准的CRUD路由。

6.总结

通过脚手架创建的模型、控制器和视图,清晰地体现了MVC架构:

  • 模型(Model)Student 模型定义了数据库表结构,并提供了业务逻辑。
  • 视图(View):视图文件负责将数据展示给用户。
  • 控制器(Controller)StudentsController 控制器处理用户的请求,并协调模型和视图之间的交互。

5.总结

本人资历尚浅,发博客主要是记录与学习,欢迎大佬们批评指教!大家也可以在评论区多多交流,相互学习,共同成长。

  • 27
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值