Ruby on Rails :: URL Customizing
Posted by PunNeng, Wed Aug 29 22:22:00 UTC 2007
กลับมาเขียนกันต่อ
ว่าจะเขียนเรื่อง route ใน rails มานานละ แต่เนื่องจากมันมีอะไรเพิ่มมาตลอด เลยต้องรอมันนิ่งก่อน แต่รอไปรอมา rails 2.0 ก็จะมาอีกแล้ว =='
ไม่เป็นไร เอาเท่าที่มีไปก่อน
จาก post อันเก่าๆ ที่เคยเขียนไป ลักษณะของ url ใน rails จะเป็นแบบนี้
/:controller/:action:/:id
นี่เป็นตัว default ของมัน ลองเปิดใน config/route.rb จะเจอ
map.connect ':controller/:action/:id.:format'
map.connect ':controller/:action/:id'
มันจะถูก map ใน controller โดยจะอยู่ในรูป
params = { :controller => 'blog', :action => 'edit', :id => '22' }
นีี่เป็นตัวกำหนดค่า default ของมัน ซึ่งเราสามารถกำหนดนามสกุลได้ด้วย เผื่อบางคนอยากได้แบบเดิมๆ เพื่อความเป็นมิตรกับ search engine
ใน controller เราจึงเรียกใช้งานได้โดย
params[:controller] # or params[:action] # or params[:id]
ถ้าจะเปลี่ยนหรือปรับปรุง จะทำไง มาดูกัน
เราสามารถกำหนด parameters เพิ่มให้มันได้ เช่น
map.connect 'articles/:year/:month/:day', :controller => 'articles', :action => 'find_by_date'
ดูเปลี่ยนไปละ
ใน controller/action เราจะเรียกเพิ่มได้ว่า
params[:controller] #=> articles params[:year] #=> ???? params[:month] #=> ?? params[:day] #=> ??
อันนี้ยังไม่ดีพอ มันยังดูกำกวม แบบนี้น่าจะดูดีกว่า
map.connect 'articles/:year/:month/:day', :controller => 'articles', :action => 'find_by_date', :year => /\d{4}/, :month => /\d{1,2}/, :day => /\d{1,2}/
แบบนี้ชัดเจนเลย ใส่ regular expression ลงไปได้ด้วย
อีกหนึ่งอย่างที่ผมชอบคือ การกำหนดชื่อของ route เช่น
map.login 'login', :controller => 'session', :action => 'login' map.show_account 'account/:id', :controller => 'account', :action => 'show'
จาก map.login เราจะใช้งานมันได้โดย
link_to "Login", login_path
link_to "View Account", show_account_path(:id => @account)
เราจะได้
<a href="/login">Login<a>
<a href="/account/2">View Account<a>
ถ้าอยากได้ url แบบ full path ก็แค่เปลี่ยนจาก login_path เป็น login_url
สมมติว่า controller เราต้อง rewrite อยู่ทุกๆ action ก็สามารถย่อโดยใช้ with_options ได้เป็น
map.with_options :controller => 'blog' do |blog| blog.show '', :action => 'list' blog.delete 'delete/:id', :action => 'delete', blog.edit 'edit/:id', :action => 'edit' end
ก็จะใช้ังานได้โดย
link_to @article.title, show_path(:id => @article)
ที่เหลืออีกเล็กๆ น้อยๆ
ActionController::Routing::Routes.draw do |map| map.connect '/', :controller => 'home' map.connect 'sitemap.xml', :controller => 'home', :action => 'sitemap' ... end
นี่เป็น pattern ง่าย โดยมันจะเรียงลำดับความสำคัญจากบนลงล่าง
url ที่เข้ามา ถ้าจับคู่กับ pattern อันไหนก่อน ก็เข้าเงื่อนไขนั้น
อีกอย่าง
map.connect '*path' , :controller => 'home' , :action => 'unrecognized?'
อันนี้ไว้สำหรับประกาศในทุกๆ กรณีของ url ที่เข้ามา หน้าที่ของมันง่ายๆ คือไว้ดัก url ที่ไม่มีนั่นแหละ
กรณีที่มีการสร้าง route แบบ run-time ยังสามารถสั่ง reload ได้โดย
Action::Controller::Routes.reload
ปล. ไว้จะมาต่อเรื่อง routing ของ restful กันอีกทีครับ
ข้อมูลจาก api ของ rails ครับ