Route是決定你網址路徑的對照表,他會決定你要往哪個controller還有往哪個action
Rails會根據config/routes.rb
決定會有什麼樣的路徑。
但也有非Route決定的網頁,Public檔案存放的就是非Route路徑的網頁,裡面有404.html這種找不到網頁或者是網站壞掉時用的頁面。
假設你的網頁首頁是http://localhost:3000/
Rails.application.routes.draw do
get "/", to: "welcome#home"
end
這時候會將網頁首頁換成welcome_controller的index這個action所對應的view/welcome/index_html.erb這個檔案的畫面。
另外設定首頁畫面也能這樣寫
Rails.application.routes.draw do
root "welcome#home"
end
Rails.application.routes.draw do
get "/about", to: "pages#about"
end
http://localhost:3000/about 這個網頁會導向pages_controller的about action所對應的view
Rails.application.routes.draw do
post '/blog/:id', to: 'blog#create'
# id是變數,可以依照需求設定變數,例如:a,:b,:cat,:handler 等等
end
除了get以外,也可以使用其他REST語法。
Route 除了做路徑對照外,也可以直接做轉址:
Rails.application.routes.draw do
get '/users', to: redirect('/accounts')
end
只要到了/users就會自動轉到/accounts的位置,除了站內的網址也可以設定轉往站外
Rails.application.routes.draw do
get '/users',to: redirect('https://google.com')
end
只要到了/users就會自動轉去google網頁
Rails 也有讓你可以快速開出八條常用路徑的方法。
Rails.application.routes.draw do
resources :users
end
想要看現在有什麼路徑可以在終端機輸入
$rails routes
如果想要縮小範圍只找users的路徑
$rails routes -c users
如果你不想要你的網址有id的話,少打一個s變成resource
Rails.application.routes.draw do
resource :users
end
單數的路徑除了沒有帶有 id 之外,也沒有index
我想要index,new,create這三個action的路徑就好
Rails.application.routes.draw do
resources :users,only: [:index, :new, :create]
end
我只想要show這個acion的路徑
Rails.application.routes.draw do
resources :users,except: [:show]
end
如果我想要多一個/users/sign_for的路徑
Rails.application.routes.draw do
resource :users do
get :sign_for
end
end
我不想要new,我想要叫sign_for
Rails.application.routes.draw do
resource :users,except: [:new] do
get :sign_for
end
end
resources跟resource的差別
resources :cats do
get :food
end
resource :cats do
get :food
end
resources會生出一個:cat_id,但是會跟:id容易搞混
在Resources會使用member與collection
member與collection的差別是member的路徑有:id,collection沒有。
Rails.application.routes.draw do
resources :users,except: [:new] do
member do
get :sign_for
end
end
end
Rails.application.routes.draw do
resources :users,except: [:new] do
collection do
get :sign_for
end
end
end
我想要在/users前面多一段/api
http://localhost:3000/api/users
Rails.application.routes.draw do
namespace :api do
resources :users
end
end
Rails.application.routes.draw do
resources :dogs,except: [:index,:new,:create]
resources :cats do
resources :dogs,only: [:index,:new,:create]
end
end
使用shallow可以得到一樣的路徑
Rails.application.routes.draw do
resources :cats do
resources :dogs,shallow: true
end
end
namespace的路徑名比較嚴格無法用變數,當路徑想要用變數的時候可以用scope
Rails.application.routes.draw do
scope :cats do
resources :dogs
end
end
scope的路徑名可以用字串,不會只能用符號
Rails.application.routes.draw do
scope "cats" do
resources :dogs
end
end
寫上module可以增加controller的上一層資料表,不過不知道哪裡會用的上就是了。
Rails.application.routes.draw do
scope "cats",module: "animal" do
resources :dogs
end
end
Rails.application.routes.draw do
scope "@:cats" do
resources :dogs
end
end
透過字串的寫法,我們能在scope的路徑寫上變數