目录#
请求的流程#
浏览器(用户)向服务器提出请求时,首先经过route对链接进行解析后并导向相应的controller,并根据以下表格,自动查找并执行定义在controller内的action:
Rails Path | Url Path | Http Type | Controller action |
---|---|---|---|
missions_path | /missions | GET | index |
missions_path | /missions | POST | create |
new_team_mission_path | /missions/new | POST | new |
edit_mission_path | /missions/id/edit | GET | edit |
missions_path | /missions/id | GET | show |
missions_path | /missions/id | PATCH | update |
missions_path | /missions/id | DELETE | destroy |
controller同时肩负向用户反馈数据的任务,包括如html.erb,js.erb,json等数据,状态码等;
在controller中,同时与负责管理数据的model相关联,执行包括数据的增删改查等操作,以将数据放入模板文件传递回给用户;
model可包含对数据的处理方法,如校验等操作;
浏览器(用户)接收到来自controller的模板或数据,或渲染,或通过js操作dom,等,以达到改变view的目的;
至此,形成一个响应循环。
开发的流程#
- 在config/routes里定义要请求的资源 resources :xxxxxx
或手动创建controller文件,或通过
bin/rails g controller 控制器名
到controller里定义各种action与action的具体内容;
例如Update动作,执行一个对表项的数据更新(model与view都发生了改变),其中数据表内容在第3、4步进行配置
1
2
3
4
5
6
7
8def update
man = Member.find params[:id] #params由rails获取
if man.update firstname: params[:firstname], lastname: params[:lastname]
head 200
else
render json: {errors: man.errors}
end
end创建model模型
bin/rails g model 模型名 数据项1:数据类型 数据项2:数据类型 .....
可在 models/模型名.rb 中添加数据校验、数据格式化等方法,例如姓名的简单合法判断:
1
2
3
4
5
6class Member < ApplicationRecord
validates :firstname, presence: { message: "姓不能为空" }
validates :lastname, presence: { message: "名不能为空" }
validates :firstname, length: {minimum: 2}
validates :lastname, length: {minimum: 2}
end如有数据表变动,则先进行数据表项的变动;再执行数据表变动的合并:
bin/rails db:migrate
添加view部分,如html.erb,js.erb 等文件;
例如一个简单的编辑页面,经route导向而来,接收来自controller的数据,渲染成正常的html页面:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28<form id="changeaman">
快改名字
<div>
<input type="hidden" name="id" value="<%= @people.id %>">
</div>
<br>
<div>姓<input type="text" name="firstname" value="<%= @people.firstname %>"></div>
<br>
<div>名<input type="text" name="lastname" value="<%= @people.lastname %>"></div>
<br>
<div><button type="submit">submit</button></div>
</form>
<script>
changeaman.onsubmit = (e) =>{
e.preventDefault()
const xhr = new XMLHttpRequest();
xhr.open("PATCH",`/master/${changeaman.id.value}`)
xhr.onload = () => {
window.location = '/master/'
}
xhr.setRequestHeader('Content-Type', 'application/json')
xhr.send(JSON.stringify({
firstname: changeaman.firstname.value,
lastname: changeaman.lastname.value
}))
}
</script>