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 ครับ

Filed Under: Ruby on Rails | Tags: howto route ruby on rails url

Comments

Have your say

A name is required. You may use HTML in your comments.




codegent: we're hiring