Rails 基本路由

2021-09-08 09:13:42 字數 3867 閱讀 2466

**:

config/routes.rb中的設定,決定了請求會由哪個控制器的動作處理,這邊要先來介紹rails中典型路由(regular route)與命令路由(named route)設定的方式(注意,routes.rb中越前頭的設定會先套用)。

你可以設定整個應用程式的首頁,例如若想要在鏈結http://localhost:3000時,等同於鏈結http://localhost:3000/messages/index,可以如下:

root :to => 'messages#index'

如果要將某個網址請求分配至某個控制器的動作,可以使用match。例如:

match 'messages/show',   :to => 'messages#show',  :via => 'get'

match 'messages/update', :to => 'message#update', :via => [:get, :post]

以上可以簡化為以下:

match 'messages/show'   => 'messages#show', :via => 'get'

match 'messages/update' => 'message#update', :via => [:get, :post]

以上設定,相當於:

get  'messages/show'   => 'messages#show'

get 'messages/update' => 'messages#update'

post 'messages/update' => 'messages#update'

match有些設定省略時會有預設,例如:

match 'messages/show'

相當於:

match 'messages/show'  => 'messages#show'

例如:

get 'messages/show'

相當於:

match 'messages/show' => 'messages#show', :via => 'get'

在 mvc 與 rails 中,messages_controller.rb中的show若要取得id請求引數,必須使用messages/show/?id=1的請求方式,如果想在請求messages/show/1時,將id設為1,可以如下:

match 'messages/show/:id' => 'messages#show'

實際上,rails會試著將請求網址匹配至每個:name,不過有些:name有意義,例如:controller與:action,來想想,應用程式中會有許多網址代表不同的請求動作,例如messages/create代表建立新訊息,messages/show/1代表顯示第一筆訊息、messages/update/1代表更新第一筆訊息,messages/destroy/1代表刪除第一筆訊息等,如果要逐一設定,會像是以下:

match 'messages/create'

match 'messages/show/:id' => 'messages#show'

match 'messages/update/:id' => 'messages#update'

match 'messages/destroy/:id' => 'messages#destroy'

也可以直接使用:controller、:action來指定控制器與動作:

match 'messages/:id' => :controller => 'messages', :action => show

如上設定之後,請求messages/1就會轉發給mesages_controller.rb中的show方法處理。

隨著應用程式越來越大,請求網址的匹配設定會越來越多,實在很麻煩,針對以上的設定,此時可以僅設定如下一行:

match ':controller(/:action(/:id(.:format)))'

其中括號表示網址請求中可有可無,事實上,這行正是在routes.rb中最後一行註解的內容,例如若請求messages/destroy/1,則:controller會是messages,:action會是destroy,:id會是1,而rails會根據:controller與:action,自動將請求分配至messages#destroy,藉此簡化設定,不過要注意,這會讓所有控制器的每個公開動作,都可以使用get請求,如果不想被請求的動作,請在方法上加上private限定。

現在假設你的routes.rb中有以下內容:

root :to => 'messages#index'

match ':controller(/:action(/:id(.:format)))'

假設你想在show.html.erb中加上個回首頁的鏈結,則可以如下:

<%= link_to "home", root_path %>

link_to是個輔助方法(helper),會產生超連結語法,第乙個引數是顯示的檔案,第二個引數是實際的網址,在這邊使用root_path輔助方法來產生頁面的相對網址,如果使用root_url則會產生絕對網址。

實際上,有些match設定,都會產生*_path與*_url的命名路由輔助方法,例如:

match 'messages/show'

預設的命名路由就是messages_show、輔助方法就是messages_show_path、messages_show_url。你也可以自行取名,例如:

match 'messages' => 'messages#index', :as => 'index'

則命名路由為index,而輔助方法為index_path與index_url,你可以如下使用:

<%= link_to "home",  index_path %>

如果是以下:

match 'messages/:id' => :controller => 'messages', :action => show, :as => messages

則可以如下使用輔助方法,其中message參考至message例項:

<%= link_to "

show

", messages_path(message) %>

如果不使用命名路由的輔助方法,則可以在指定控制器與動作。例如:

<%= link_to "

home

", :controller => '

messages

', :action => '

index

' %>

routes.rb中設定越前頭越先套用,*_url、*_path輔助方法、網址與控制器動作的對應,可以執行rake routes指令來得知。

如果想限制引數,可以如下:

match "

/messages/show/:id

" => "

messages#show

", :constraints =>

這會限制id一定要是乙個整數,也可以使用contraints方法作高階限定,例如限定ip位址:

constraints(:ip => /(^127.0.0.1$)|(^192.168.[0-9].[0-9]$)/) do

match

"/admins/edit/:id

" => "

admins#edit

"end

rails還支援restful路由設定,這在之後還會說明。

rails4 routes基本使用

基本方式 match products id products show via get 簡寫get products id products show post products products create 同乙個url對應多個http method match products id pro...

Rails3路由簡析

rails3跟rails2的路由設定差別還是比較大的,我最近太2了,一直沒想起來查官方guide,導致浪費了不少時間去試.rails3的路由預設使用restful風格的設定。當使用scaffold生成controller的時候,rails會為其生成幾個對應get put delete update等...

rails下的link to 和相應的路由配置

剛開始接觸rails,做活動通的專案,遇到的問題很多,大概遇到問題我會看書或者上網查閱相關資料,如果能直接通過這些方式直接得到答案,那當然最好,有的問題卻不只單單通過查資料而直接得到答案的,需要自己學習 模仿 總結 理解後,才能解決。這裡,我就說說我遇到的rails下的link to和路由配置問題。...