侧边栏壁纸
博主头像
极客日记 博主等级

行动起来,活在当下

  • 累计撰写 93 篇文章
  • 累计创建 17 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

【Ruby on Rails】RESTful 路由

Jack.Jia
2022-03-19 / 0 评论 / 0 点赞 / 4 阅读 / 0 字

RESTful 路由

使用不同的请求类型, 来获取各种资源。

POST: create,  (创建资源)
PUT/PATCH: update, (更新)
GET:  index, show, new, edit, (只读取数据,不修改数据)
DELETE: destroy (删除)

所以, 在 RESTful 中,不同的 http request 类型,就决定了你是要对数据库进行 什么操作(增,删,改,还是只读?)

至于 rails, 是如何实现对 RESTful 进行解析的呢?

极其简单:

config/routes.rb 中:

resources :users

(注意: 不是 resource) 上面一句,就直接定义了 7 种路由:

GET  /users         index     显示 user的列表页
GET  /users/new     new       显示 user的新建页面。
GET  /users/3       show      显示id是3的user
GET  /users/3/edit  edit      显示 user(id =3)的编辑页面。
PUT  /users/3       update    对id = 3的user进行修改 (后面还会紧跟一大串的参数)
POST /users         create    对users进行创建(后面也有一大堆参数)
DELETE  /users/3    destroy   对 id=3的 user 进行删除操作。
(可以使用 $ rake routes 就可以查看当前项目中所有的路由)

这就是一种: convention(约定) over configuration ( 配置)

Rails 中的各种 path, url 的来历

下面的代码, 来自某个项目中的命令: $ rake routes:

    POST     /travels(.:format)             travels#create
    GET      /travels/new(.:format)         travels#new
    GET      /travels/:id/edit(.:format)    travels#edit
    GET      /travels/:id(.:format)         travels#show
    PATCH    /travels/:id(.:format)         travels#update
    PUT      /travels/:id(.:format)         travels#update
    DELETE   /travels/:id(.:format)         travels#destroy

我把它整理一下, 大家就知道内容是什么了:
| url 的名字 | REST 方法 | 对应的 url 的表达式 | 对应的 controller#action |
| — | — | — | — |
|travels_path| POST| /travels(.:format)| travels#create|
|new_travel_path| GET| /travels/new(.:format)| travels#new
|edit_travel_path| GET| /travels/:id/edit(.:format)| travels#edit
|travel_path| GET| /travels/:id(.:format)| travels#show
|travel_path| PATCH| /travels/:id(.:format)| travels#update
|travel_path| PUT| /travels/:id(.:format)| travels#update
|travel_path| DELETE| /travels/:id(.:format)| travels#destroy

所以, 看到第一列了吗? 大家见到的 xx_path, xx_url 就是从这里来的. 另外, travel_path 等同于 travel_url.

edit_user_path @user 是什么东东?

如何编辑某个 user?

"/users/1/edit"

写成 ruby 代码:

"/users/" + user.id + "/edit"
"/users/#{user.id}/edit" # string interpolation 插入插值

实际上上面这两种形式,都是外行的风格(比如,之前做 java 的同学, 来写 ruby , 就是这个风格)

下面是 Rails 风格 ( 把可读性发挥到极致)的写法:

最初的形式:

<%= edit_user_url({:id => User.first.id}) %>

然后,ruby 的最外层的方法调用的 () 可以省略:

<%= edit_user_url {:id => User.first.id} %> <br/>

ruby 的最外层的 hash 的 {} 可以省略:

<%= edit_user_url :id => User.first.id %> <br/>

对于 rails 来说,每个数据库的对象,转换成 string interpolation 的时候,都是默认调用 id 方法。

所以, 一个默认的 model 当它 to_string 的时候, 是要返回 id 的.

所以, 最终, 也就有了这样的写法:

<%= edit_user_url User.first %>

特殊情况

在 controller 中, 在 create/ update/ 方法的尾部, 我们需要跳转到其他 URL。 会看到这样的代码:

def create
  book = Book.create params[:book]
  redirect_to book
end

上面的 redirect_to book, 等同于:

redirect_to book
  redirect_to book_path(:id => book.id)
  redirect_to '/books/' + book.id

最后

有空使劲看: http://guides.rubyonrails.org/routing.html 有 各种 url, path 的来历和用法.

resources :countries do 
    resources :provinces do 
        resources :cities do 
            resources :districts do 
                ... 
            end 
        end 
    end 
end
0

评论区