rails初探

目录#

请求的流程#

浏览器(用户)向服务器提出请求时,首先经过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的目的;

至此,形成一个响应循环。

开发的流程#

  1. 在config/routes里定义要请求的资源 resources :xxxxxx
  2. 或手动创建controller文件,或通过
    bin/rails g controller 控制器名

    到controller里定义各种action与action的具体内容;

    例如Update动作,执行一个对表项的数据更新(model与view都发生了改变),其中数据表内容在第3、4步进行配置

    1
    2
    3
    4
    5
    6
    7
    8
    def 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
  3. 创建model模型

    bin/rails g model 模型名 数据项1:数据类型 数据项2:数据类型 .....

    可在 models/模型名.rb 中添加数据校验、数据格式化等方法,例如姓名的简单合法判断:

    1
    2
    3
    4
    5
    6
    class Member < ApplicationRecord
    validates :firstname, presence: { message: "姓不能为空" }
    validates :lastname, presence: { message: "名不能为空" }
    validates :firstname, length: {minimum: 2}
    validates :lastname, length: {minimum: 2}
    end
  4. 如有数据表变动,则先进行数据表项的变动;再执行数据表变动的合并:

    bin/rails db:migrate

  5. 添加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>