Rotaie risorse RESTful utilizzando to_param per un campo che contiene caratteri separatori
-
09-09-2019 - |
Domanda
Voglio che i miei Rails 2.3.2 app per rispondere e generare URL in questo modo:
/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 generare migliori URL 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 perché la '' carattere è definito ActionController :: Routing :: separatori, che elenca i caratteri speciali per dividere l'URL su. Questo ti permette di fare cose come /websites/1.xml.
SO, c'è un modo pulito per permettere '' caratteri negli URL RESTful?
Ho provato ridefinendo ActionController :: Routing :: SEPARATORI di non includere '', che è un totalmente brutto modo di risolvere il problema. Questo scombina URL generati aggiungendo ":. Formato". A loro
so anche che posso aggiungere: requisiti => {: id => regexp} al mio config / routes.rb per abbinare un nome di dominio che include '' (Senza questa, params [: id] '' è impostato alla parte del nome a dominio prima della prima)., Ma questo non aiuta a generare URL / percorsi restfully
Molte grazie :) Nick
Soluzione
Risolto il problema, con un grande grazie a 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. Così ho potuto anche avere
websites_requirements.resources :accounts
websites_requirements.resources :monthly_bandwidth_records
etc.
Altri suggerimenti
Questa è una questione interessante. Non credo che si può sbarazzarsi del cattivo '.:format'
aggiunto alla fine se si fa un map.resources
base. Se si desidera che i periodi nei nomi, non si è in accordo con i soliti stili rotaie, e penso che un percorso personalizzato potrebbe essere in ordine se assolutamente BISOGNO del '' nell'URL.
Tuttavia, forse si dovrebbe pensare di cambiare la tua definizione di to_param
. Che cosa pensare di utilizzare il seguente?
def to_param
domain_name.sub('.','_dot_')
end
Credo 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/
Ho avuto un problema simile qualche tempo fa e arrivato a una soluzione simile. Utilizzando /.+/ come il requisito per il parametro in questione ha funzionato bene per me.
http://zargony.com/2009/05 / 05 / routing-parametri-con-un-dot