在前面創建的工程中可以發現,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中的新增、編輯、刪除、查看等跳轉