2009-06-04 11 views
8

Chcę moje Rails 2.3.2 aplikacji do reagowania i generować adresy URL tak:Szyny zasobów REST wykorzystujące to_param pola, która zawiera znaki separatora

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

W moim config/routes.rb, mam:

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

mogę następnie uzyskiwanie dostępu do zasobów, takich jak:

/websites/1 
/websites/1/dns_records 

Poprzez modyfikację mojego modelu WWW, mogę g ożywić lepsze adresy URL, takie jak:

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 

Jednak w przypadku nazw domen zawierających znak "." postaci, Railsy stają się nieszczęśliwe. Uważam, że dzieje się tak dlatego, że "." znak jest zdefiniowany w ActionController :: Routing :: SEPARATORS, który zawiera znaki specjalne do podziału adresu URL. Pozwala to na robienie rzeczy takich jak /websites/1.xml.

SO, czy istnieje czysty sposób na zezwolenie "." znaków w RESTful URLs?

Próbowałem przedefiniować ActionController :: Routing :: SEPARATORS, aby nie uwzględniać ".", Co jest całkowicie złym sposobem na rozwiązanie problemu. Spowoduje to przeniesienie generowanych adresów URL przez dodanie do nich ".: Format".

Wiem również, że mogę dodać: requirements => {: id => regexp} do mojej config/routes.rb w celu dopasowania nazwy domeny zawierającej "." (bez tego params [: id] jest ustawiony na część nazwy domeny przed pierwszym "."), ale to nie pomaga w generowaniu URL/ścieżek RESTfully.

Dziękujemy :) Nick

Odpowiedz

4

rozwiązał problem, z dużym Dzięki http://poocs.net/2007/11/14/special-characters-and-nested-routes (i zobaczyć http://dev.rubyonrails.org/ticket/6426 dodatkowego odniesienia)

musiałem dodać: wymagania => {: website_id => regexp} dla każdego zagnieżdżonego trasie, która została również będzie zawierać nazwę domeny z okresów w nim.

Oto moja droga robocza:

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 

Wezwanie do

websites.with_options 

jest po prostu zgodnie z suchymi, tak aby: wymagania nie muszą być określone dla wszystkich zagnieżdżonych trasy dla witryn. Więc mogłem też mieć

1

Jest to ciekawy problem. Nie sądzę, żebyś mógł się pozbyć złego '.:format' dołączonego do końca, jeśli wykonasz podstawowe map.resources. Jeśli chcesz okresów w nazwach, nie są zgodne z typowymi stylami szyn i myślę, że niestandardowa trasa może być w porządku, jeśli absolutnie NEED "." w adresie URL.

Może jednak warto rozważyć zmianę definicji to_param. Co byś pomyślał o użyciu poniższych rozwiązań?

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

Myślę, że jeśli używasz to zarządzać stron internetowych klientów, jest to dość elegancki sposób, aby wygenerować ładne (i przyjazny SEO) URL jak

/websites/asd_dot_com/dns_records/new 
/websites/asd_dot_com/ 
Powiązane problemy