2009-06-04 97 views
8

我想我的Rails 2.3.2應用程序響應並生成URL,像這樣:Rails的RESTful資源

/websites/asd.com 
/websites/asd.com/dns_records/new 

在我的config/routes.rb中,我有:

map.resources :websites, :has_many => :dns_records 
map.resources :dns_records, :belongs_to => :website 

我可以再訪問諸如:

/websites/1 
/websites/1/dns_records 

通過修改我的網站模式,我可以摹嵌入更好的網址如下:

class Website < ActiveRecord::Base 
    def to_param 
     domain_name 
    end 
    ... 
end 

# app/views/websites/index.erb 
<% @websites.each do |w| %> 
<%= link_to "Show #{w}", website_path(w) %> 
<% end %> 

# Produces a link to: 
/websites/example_without_periods_in_name 

但是,對於包含'。'的域名,人物,Rails變得不快樂。我相信這是因爲'。'字符在ActionController :: Routing :: SEPARATORS中定義,其中列出了用於分割URL的特殊字符。這可以讓你做像/websites/1.xml這樣的東西。

那麼,有沒有一種乾淨的方式來允許'。' RESTful URL中的字符?

我試着重新定義ActionController :: Routing :: SEPARATORS不包含'。',這是一個完全不好的方法來解決問題。這通過向他們附加「。:format」來混淆生成的URL。

我也知道我可以將:requirements => {:id => regexp}添加到我的config/routes.rb中,以匹配包含'。'的域名。 (沒有這個,在第一個'。'之前,params [:id]被設置爲域名的一部分),但這無助於RESTful地生成URL /路徑。

非常感謝:) 尼克

回答

4

問題解決了不錯(和搜索引擎友好)的URL相當優雅的方式,有一個大感謝http://poocs.net/2007/11/14/special-characters-and-nested-routes(並參見http://dev.rubyonrails.org/ticket/6426的其他參考)

我需要爲每個嵌套的路線添加:requirements => {:website_id => regexp},該路線也將包含一個包含句點的域名。

這是我的工作路線:

map.resources :websites, :requirements => { :id => /[a-zA-Z0-9\-\.]+/ } do |websites| 
    websites.with_options :requirements => { :website_id => /[a-zA-Z0-9\-\.]+/ } do |websites_requirements| 
     websites_requirements.resources :dns_records 
    end 
end 

<%= link_to 'New DNS Record', new_website_dns_record_path(@website) %> 

# Produces the URL 
/websites/asd.com/dns_records/new 

的調用

websites.with_options 

被簡單地用幹保持這樣認爲:要求沒有爲網站所有嵌套路由進行指定。所以我也可以有

websites_requirements.resources :accounts 
websites_requirements.resources :monthly_bandwidth_records 
etc. 
1

這是一個有趣的問題。如果你做了一個基本的map.resources,我不認爲你可以擺脫壞的'.:format'追加到最後。如果你想要名稱中的時間段,你不符合通常的導軌風格,並且我認爲如果你絕對需要定製路線,那麼'012'在URL中。

但是,也許你應該考慮改變你的to_param的定義。你會怎麼看待使用以下內容?

def to_param 
    domain_name.sub('.','_dot_') 
end 

我認爲,如果你使用這個管理客戶的網站,它是產生像

/websites/asd_dot_com/dns_records/new 
/websites/asd_dot_com/