2010-01-15 28 views
5

Tôi đang phát triển ứng dụng Rails theo mặc định thiết lập tài khoản người dùng cho tên miền phụ mà họ chọn. Là một tùy chọn, họ sẽ có thể ánh xạ toàn bộ miền của riêng họ vào tài khoản của họ.Làm cách nào để ánh xạ miền đầy đủ sang tài khoản ứng dụng Rails dựa trên miền phụ?

Cho đến nay đây là cách tôi thiết lập mọi thứ. Tôi đang sử dụng subdomain-fu để tăng sức mạnh các tuyến:

# routes.rb 
map.with_options :conditions => {:subdomain => true} do |app| 
    app.resources # User's application routes are all mapped here 
end 

map.with_options :conditions => {:subdomain => false} do |www| 
    www.resources # Public-facing sales website routes are mapped here 
end 

Bên cạnh đó, tôi đang sử dụng method described here để có được những tài khoản được truy cập thông qua tên miền phụ hoặc miền đầy đủ:

before_filter :set_current_account 

def set_current_account 
    if request.host.ends_with? current_domain 
    # via subdomain 
    @current_club = Club.find_by_subdomain(current_subdomain) 
    else 
    # via full domain 
    @current_club = Club.find_by_mapped_domain(request.host) 
    end 
end 

Tôi có không đã đi rất xa quá trình xây dựng này, nhưng tôi đã có thể thấy tôi sẽ gặp vấn đề với định tuyến. Nếu request.host là một số tên miền random.com thì subdomain-fu sẽ không định tuyến các tuyến thích hợp?

Tôi cho rằng đây không phải là vấn đề bất thường, vì vậy bất kỳ ai cũng có thể chia sẻ cách họ giải quyết vấn đề này hoặc cách tôi định cấu hình tuyến đường để thực hiện những gì tôi cần?

Trả lời

2

Tôi gặp sự cố này, cố gắng làm quá nhiều trong một ứng dụng đơn lẻ. Bạn sẽ bắt đầu làm điều kiện ở những nơi rất kỳ quặc mà bạn không cần phải làm. Tôi quyết định có 2 ứng dụng Rails riêng biệt có tên miền ký tự đại diện trỏ tới ứng dụng của Người dùng, sau đó có www.domain.comdomain.com trỏ đến phía công khai. Tôi biết điều này không hoàn toàn "trả lời" câu hỏi của bạn trực tiếp.

mùi code nhỏ đó mà tôi có thể giúp bạn khắc phục, nếu bạn thêm video này vào phía trên cùng của phương pháp đó:

return @current_club if defined?(@current_club) 

Nó sẽ không làm cho một truy vấn cho mỗi lần bạn cố gắng truy cập vào @current_club, nó sẽ trả lại kết quả bạn đã trả lại.

+0

Cám ơn câu trả lời của bạn. Sau khi thử nghiệm với giải pháp khác được đăng ở đây, tôi đã đi đến kết luận rằng bạn đúng và vì tính đơn giản vì điều tốt nhất là chia thành hai ứng dụng và loại bỏ tên miền phụ-fu. – aaronrussell

3

Bạn có thể viết Phần mềm trung gian giá để chuyển đổi tên miền thành tên miền phụ trước khi nó truy cập ứng dụng Rails.

class AccountDetector 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    account = Club.find_by_mapped_domain(env["HTTP_HOST"]) 
    if account 
     env["HTTP_HOST"] = "#{account.subdomain}.yourdomain.com" 
    end 

    @app.call(env) 
    end 
end 

Sau đó thêm rằng vào environment.rb:

config.middleware.use AccountDetector 
+0

Cảm ơn bạn. Tôi thích câu trả lời này vì vậy đã làm một số thử nghiệm. Kịch bản phần mềm trung gian của bạn hoạt động tốt, nhưng tiếc là nó đã có một số hiệu ứng knock-on lạ với các phiên (sử dụng Authlogic). Tôi đã quyết định - miễn cưỡng - chia ứng dụng thành hai ứng dụng riêng biệt. – aaronrussell

Các vấn đề liên quan