ruby on rails(ROR)從入門到放棄:五(routes.rb)之 resources用法一

在前面創建的工程中可以發現,routes.rb路由配置中,使用腳手架生成的book的路由配置是這樣的:resources :book

:book這樣的寫法爲Symbol,我的理解爲 :book寫法跟 "book"字符串類似,只是如果我們在很多地方都使用了“book”這個字符串的話,那麼將會new出來很多的book字符串,這是不必要的,使用了Symbol類型的 :book會使內存中只存在一份。

那麼使用了resouces :book代碼之後,ROR會幫我們生成好以下路徑

GET /books  Books  index display a list of all photos
GET /books/new Books  new return anHTMLform for creating a new photo
POST /books Books  create create a new photo
GET /books/1 Books  show display a specific photo
GET /books/1/edit Books  edit return anHTMLform for editing a photo
PUT /books/1 Books  update update a specific photo
DELETE /books/1 Books  destroy delete a specific photo

同時生成URL與PATH

books_url 和books_path映射到index和create兩個action

new_book_url和new_book_path映射到new action

edit_book_url和edit_book_path映射到edit action

book_url和book_path映射到show, update和destroy三個action

因爲路由同時使用HTTP動詞和path二者分發請求,因此這七個RESTful路由生成的路徑只有4對helper.


如果要在book中添加更多的自定義的路由需要使用member方法,比如在books_controller.rb中添加方法

def test1
    render html: "I'm test1 page" << test1_book_url << ";" << test1_book_path
end

則需要在routes.rb中將 resources :book更改成如下:

resources :book do
    member do
        get 'test1'  #本行代碼可以寫成這樣 get :test1
    end
end

重啓之後訪問 http://127.0.0.1:3000/books/1/test1

增加了get 'test1' 之後,會同步生成URL與PATH :   test1_book_url 和 test1_book_path

當如果沒有太多的member路由規則時,可以用下面的代碼進行替換:

resources :books do
    get 'test1', on: :member
end

接下來使用稍微複雜的路由,在book_controller.rb中增加方法:

def demo1
    render html: "I'm demo1 page" << test3_book_url << ";" << test3_book_path
end

同時更改routes.rb修改爲:

resources :book do
    member do
        get 'test1'  #本行代碼可以寫成這樣 get :test1
    end
    get 'test2', to: 'books#demo1', as: 'test3', on: :member
end

重啓之後訪問:http://127.0.0.1/books/1/test2

從響應結果中可以觀察出 test被路由到了books_controller中的demo1方法中,同時URL於PATH被改變成了test3_book_url於test3_book_path


當如果想限制book的列表頁不能被訪問到時,可以使用only參數

resources :books, except: [:index]

或者限制只能訪問列表頁

reources :books, only: [:index] #請同步刪除掉index.html.erb中的新增、編輯、刪除、查看等跳轉

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章