2012-06-15 34 views
5

Tôi đang cố gắng thiết lập Tên miền phụ trong Rails 3 trên Ryan Bates screencast on subdomains. Tuy nhiên nó không làm việc cho tôi. Tôi có các thiết lập sau:request.subdomain không được đặt trong Rails 3 trong khi định tuyến có điều kiện

# routes.rb 
constraints(Subdomain) do 
    get 'devices' => 'devices#all' 
end 

# lib/subdomain.rb 
class Subdomain 
    def self.matches?(request) 
    # binding.pry 
    request.subdomain.present? && request.subdomain == "admin" 
    end 
end 

Loading the url admin.localhost:3000/devices nên con đường tôi để devices#all, tuy nhiên tôi nhận được một lỗi định tuyến Routing Error No route matches [GET] "/devices" Rõ ràng định tuyến của tôi không hoạt động.

tôi thiết lập một debug phiên pry có nhận xét là ở trên, và nó được nhấn, vì vậy hạn chế của tôi đang làm việc, nhưng tôi nhận được kết quả như sau:

[1] pry(Subdomain)> request.subdomain 
=> "" 
[2] pry(Subdomain)> request.subdomains 
=> [] 
[3] pry(Subdomain)> request.host 
=> "admin.localhost" 

Vì vậy, đường ray không được chọn lên các quản trị một phần của url và đặt nó vào biến tên miền phụ. Trong khi tôi có thể dễ dàng chỉ cần sử dụng giá trị máy chủ để lọc các tuyến quản trị, tôi muốn giữ cho mọi thứ sạch sẽ và chính xác.

Cách đường ray không đặt giá trị tên miền phụ?


Sửa

Cả jdoecoreyward là đúng với câu trả lời của họ. Điều gì đã khiến tôi thất vọng là tôi cũng đang sử dụng powxip.io để truy cập trang web và gặp lỗi tương tự. Đó là lẻ bởi vì http://admin.app_name.192.168.1.68.xip.io/devices có một tld> 1. Điều gì đã xảy ra là tên miền phụ cho xipadmin.app_name.192.168.1.68, cũng không được cung cấp logic phù hợp và không định tuyến.

+0

> Cách đường ray không đặt giá trị tên miền phụ? Tôi nghĩ rằng nó vẫn còn Rack tại thời điểm đó. –

+0

@OscarDelBen nó không phải.Đó là ActionDispatch 'request.inspect # =>

+0

+1 để làm rõ thêm về Pow & Xip.io. :) – coreyward

Trả lời

9

Vì không có tên miền phụ nào theo như Rails xem xét.

Đường ray hy vọng bạn cung cấp độ dài Top-Level Domain (TLD) cho TLD có hơn 1 dấu chấm. Ví dụ, nếu bạn có bbc.co.uk nó sẽ đón "bbc" là tên miền phụ trừ khi bạn chỉ định độ dài TLD là 2, trong trường hợp này tên miền phụ sẽ được để trống:

request.subdomain(2) #=> "" 

Đây cũng là lý do tại sao bạn đang thấy subdomains trả lại một mảng trống: hai phân đoạn cuối cùng sẽ bị loại bỏ tự động. Bạn có thể chỉ định 0 làm chiều dài TLD để lấy lại "quản trị", nhưng mã đó sẽ đột nhập vào sản xuất với tên miền thực, vì vậy tôi không khuyên bạn nên sử dụng nó.

Tôi khuyên bạn nên sử dụng miền như admin.yourapp.dev được chuyển trở lại máy tính của bạn qua máy chủ cục bộ để làm cho ứng dụng của bạn phát hiện đúng tên miền phụ. Chỉ cần chỉnh sửa/etc/hosts để làm điều đó đơn giản.

Nếu bạn tò mò, here is the Rails source for the subdomain method.

+0

Cảm ơn câu trả lời. Tôi đã đánh dấu chính xác của bạn vì tôi đã xem xét nguồn cho phương thức tên miền phụ trước khi đăng trên SO. : X –

5

Hãy thử sử dụng địa chỉ đặc biệt: http://admin.lvh.me:3000/devices

Hoặc thiết lập:

config.action_dispatch.tld_length = 0 

trong development.rb của bạn và khởi động lại ứng dụng của bạn.

+0

Cảm ơn @jdoe vì câu trả lời. Nhấn admin.lvh.me đã giúp mọi thứ rõ ràng. –

+0

thiết lập action_dispatch_tld là một giải pháp phần mềm tốt nhất. dường như làm việc cho nhu cầu của tôi – Kevin

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