2009-06-04 5 views
8

Voglio che i miei Rails 2.3.2 app per rispondere e generare URL in questo modo:Rails risorse RESTful utilizzando to_param per un campo che contiene caratteri separatori

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

Nel mio config/routes.rb, ho:

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

posso quindi accedere alle risorse come ad esempio:

/websites/1 
/websites/1/dns_records 

modificando il mio modello sito web, posso g enerare gli URL migliori in questo modo:

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 

Tuttavia, per i nomi di dominio che contengono '.' personaggi, Rails diventa infelice. Credo che questo sia dovuto al "." il carattere è definito in ActionController :: Routing :: SEPARATORS, che elenca caratteri speciali su cui suddividere l'URL. Questo ti permette di fare cose come /websites/1.xml.

SO, c'è un modo pulito per consentire '.' caratteri negli URL RESTful?

Ho provato a ridefinire ActionController :: Routing :: SEPARATORS per non includere ".", Che è un modo totalmente sbagliato per risolvere il problema. Questo rovina gli URL generati aggiungendo ".: Format" a loro.

So anche che posso aggiungere: requisiti => {: id => regexp} al mio config/routes.rb per abbinare un nome di dominio che include '.' (senza questo, params [: id] è impostato sulla parte del nome del dominio prima del primo '.'), ma questo non aiuta a generare URL/percorsi RESTfully.

Molte grazie :) Nick

risposta

4

Risolto il problema, con un grande grazie alla http://poocs.net/2007/11/14/special-characters-and-nested-routes (e vedere http://dev.rubyonrails.org/ticket/6426 per riferimento aggiuntivo)

avevo bisogno di aggiungere: requisiti => {: website_id => regexp} per ogni percorso nidificato che è stato anche andando a includere un nome di dominio con i periodi in esso.

Ecco il mio percorso di lavoro:

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 

La chiamata a

websites.with_options 

è semplicemente in linea con DRY in modo che: i requisiti non devono essere specificati per tutte le rotte nidificate per i siti web. Quindi potrei anche avere

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

questo è un problema interessante. Non penso che tu possa sbarazzarti del pessimo '.:format' aggiunto alla fine se fai un semplice map.resources. Se desideri inserire dei termini nei nomi, non sei conforme ai soliti stili di rotaie e penso che un percorso personalizzato potrebbe essere in ordine se hai assolutamente bisogno di NECESSARIO. nell'URL.

Tuttavia, potrebbe essere necessario modificare la definizione di to_param. Cosa penseresti di usare il seguente?

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

Penso che, se si sta utilizzando questo per gestire siti web dei clienti, è un modo abbastanza elegante per generare belle (e SEO friendly) URL come

/websites/asd_dot_com/dns_records/new 
/websites/asd_dot_com/ 
Problemi correlati