วันอังคารที่ 14 กันยายน พ.ศ. 2553

1 Rails App สำหรับ หลายๆ โดเมน

โอ้วๆ หามานาน เรื่องมันมีอยู่ว่า นานมาแล้ว นั่งทำเว็บไซต์ด้วย Rails มาตั้งนาน เสร็จแล้วก็ออกแบบ ซะดิบดี ได้ออกมาเป็นเว็บหน้าตาดี 1 อัน ทีนี้ อยากได้เว็บที่มันใช้ Engine เดียวกันนี่เหละ แต่รายละเอียดมันต่างกันออกไปนิดนึง (อย่างเช่น layout ไม่เหมือนกัน) แต่ส่วนใหญ่ ใช้แนวคิดเดิมๆ ถ้าแยก Rails App กันซะ มันก็หมดเรื่อง แต่มันก็ ต้องแก้ bug ทั้ง 2 อัน

แล้วจะทำไงดีหล่ะ อยากจะรับจ้างทำเว็บไซต์ แต่ใครจะมานั่ง deploy & Bug fix ทุกๆอัน ก็เลยออกมาเป็น solution ดังนี้

1. ใช้ทริ๊กของ Rails Route โดยปรับให้รับเงื่อนไข เรื่อง request.host, request.domain เพิ่มเติมเข้ามา
2. จากนั้น สร้างเป็นไฟล์ เพื่อเข้าไปใน /config/initializers (ชื่อไฟล์อะไรก็ได้)

จากนั้นก็ลองทดสอบดูดิ ว่า ถ้า request host มาหลายๆแบบ แล้ว route ไปคนละ ทาง

# /config/initializers/multiple_domain_route.rb ################################

#
# This allows us to set up custom routes that depend on the domain or host of the request, ie:
# map.connect '', :controller => 'blah', :action => 'blah', :conditions => {:domain => 'blah'}
#

module ActionController
module Routing
class RouteSet
def extract_request_environment(request)
env = { :method => request.method }
env[:domain] = request.domain if request.domain
env[:host] = request.host if request.host
env
end
end
class Route
alias_method :old_recognition_conditions, :recognition_conditions
def recognition_conditions
result = old_recognition_conditions
result << "conditions[:domain] === env[:domain]" if conditions[:domain]
result << "conditions[:host] === env[:host]" if conditions[:host]
result
end
end
end
end

############################################################

# /cofig/route.rb ###############################################

ActionController::Routing::Routes.draw do |map|

map.connect '/', :controller => 'nutjang2', :action => 'index', :conditions=>{ :host=>'www.nutjang2.com' }
map.connect '/', :controller => 'nutjang3', :action => 'index', :conditions=>{ :host=>'www.nutjang3.com' }

map.root :controller => "welcome"

map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'
end

############################################################

วิธีการทดสอบบน windows ที่จะชี้ไปว่าเป็น หลายๆ โดเมนก็ง่ายแสนง่าย c:/windows/system32/driver/etc/hosts

เพิ่มบรรทัดพวกนี้เข้าไป แล้วลองเปิด browser เรียก www.nutjang2.com, www.nutjang3.com ดู แล้วเทียบกับ log ของ Rails ว่า มัน route ถูกไหม

192.168.1.201 www.nutjang2.com
192.168.1.201 www.nutjang3.com

ไม่มีความคิดเห็น:

แสดงความคิดเห็น