Rotaie risorse RESTful utilizzando to_param per un campo che contiene caratteri separatori

StackOverflow https://stackoverflow.com/questions/948886

  •  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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top