2012-05-09 11 views
11

Nói rằng tôi có các tuyến đường sau đó bị hạn chế để các tên miền phụ cụ thể:Bao gồm tên miền phụ cho tuyến đường bó buộc trong Rails url helper

App::Application.routes.draw do 
    constraints :subdomain => "admin" do 
    scope :module => "backend", :as => "backend" do 
     resources :signups 
     root :to => "signups#index" 
    end 
    end 
    constraints :subdomain => "www" do 
    resources :main 
    root :to => "main#landing" 
    end 
end 

Vấn đề của tôi là root_urlbackend_root_url cả trả về một url trên các tên miền phụ hiện tại: "http : // tên miền phụ hiện tại .lvh.me/"thay vào đó tên miền phụ cụ thể cho tài nguyên. Tôi muốn root_url để trở về "http: // www .lvh.me /" và backend_root_url để trở về "http: // quản trị .lvh.me /" (hành vi nên giống nhau cho tất cả các nguồn tài nguyên dưới tên miền phụ).

tôi đã cố gắng thực hiện điều này trong đường ray 3.2 bằng cách thiết lập các tùy chọn url ở những nơi khác nhau, một là url_options trong điều khiển ứng dụng:

class ApplicationController < ActionController::Base 
    def url_options 
    {host: "lvh.me", only_path: false}.merge(super) 
    end 
end 

Có lẽ tôi cần phải ghi đè lên những người giúp đỡ url cách thủ công? Làm thế nào tôi sẽ tiếp cận điều đó (truy cập vào các tuyến đường vv)?

Chỉnh sửa: Tôi có thể nhận kết quả chính xác bằng cách sử dụng root_url (: subdomain => "admin") trả về "http: // admin .lvh.me /" bất kể tên miền phụ hiện tại. Tuy nhiên, tôi không muốn phải chỉ định điều này trên tất cả các mã.

Trả lời

9

Sử dụng "mặc định" như được hiển thị bên dưới sẽ làm cho người trợ giúp đường dẫn URL xuất ra tên miền phụ chính xác.

App::Application.routes.draw do 
    constraints :subdomain => "admin" do 
    scope :module => "backend", :as => "backend" do 
     defaults :subdomain => "admin" do 
     resources :signups 
     root :to => "signups#index", :subdomain => "admin" 
     end 
    end 
    end 

    constraints :subdomain => "www" do 
    defaults :subdomain => "www" do 
     resources :main 
     root :to => "main#landing" 
    end 
    end 
end 
+0

Điều này rất tuyệt! Một vấn đề mà tôi gặp phải là điều này chỉ hoạt động nếu tên miền cơ sở của bạn chưa bao gồm tên miền phụ. Nếu có, bạn cần phải bao gồm đó là: host. Hoặc bạn có thể thiết lập: host bằng cách định nghĩa ApplicationController # default_url_options để trả về một hash chứa: host. – mltsy

+0

Tôi lấy lại, ngay cả điều đó cũng không giải quyết được vấn đề nếu bạn đã có tên miền phụ cho tên máy chủ chính của bạn. Tôi đã không tìm ra cách để làm điều đó mà không cần viết phương thức trợ giúp của riêng bạn. – mltsy