**:
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]$)/) domatch
"/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和路由配置問題。...