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