2009-06-04 7 views
8

Ich möchte meine Rails 2.3.2 app reagieren und generieren URLs wie folgt:Rails RESTful Ressourcen für ein Feld mit to_param, die Trennzeichen enthält

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

In meiner config/routes.rb, ich habe:

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

ich kann dann Zugriff auf Ressourcen wie:

/websites/1 
/websites/1/dns_records 

Durch meine Webseite Modell zu modifizieren, kann ich g Erstellen Sie bessere URLs wie folgt:

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 

Für Domain-Namen, die '.' Charaktere, Rails wird unglücklich. Ich glaube, das liegt daran, dass das "." Das Zeichen ist in ActionController :: Routing :: SEPARATORS definiert, in dem Sonderzeichen zum Aufteilen der URL aufgeführt sind. Dies ermöglicht Ihnen, Dinge wie /websites/1.xml zu tun.

SO, gibt es eine saubere Möglichkeit, '.' Zeichen in RESTful URLs?

Ich habe versucht, Actioncontroller :: Routing :: SEPARATOR Neudefinition nicht enthalten ‚‘, das ist ein ganz schlechter Weg, um das Problem zu lösen. Dadurch werden generierte URLs durch Anhängen von ".: Format" an sie verfälscht.

Ich weiß auch, ich kann hinzufügen: Anforderungen => {: ID => regexp} zu meiner config/routes.rb, um einen Domänennamen, der "." (Ohne dies wird params [: id] auf den Teil des Domain-Namens vor dem ersten '.' gesetzt), aber dies hilft nicht bei der URL-Erstellung/Pfade RESTfully.

Vielen Dank :) Nick

Antwort

4

das Problem gelöst, mit einem großen dank http://poocs.net/2007/11/14/special-characters-and-nested-routes (und siehe http://dev.rubyonrails.org/ticket/6426 für weitere Referenz)

musste ich hinzufügen: Anforderungen => {: website_id => regexp} für jede verschachtelte Route, die auch einen Domain-Namen mit Perioden darin enthalten würde.

Hier ist meine Arbeits Route:

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 

Der Aufruf von

websites.with_options 

wird einfach mit DRY zu halten, so dass: Anforderungen nicht für alle verschachtelten Routen für Websites angegeben werden. Also könnte ich auch haben

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

Dies ist eine interessante Frage. Ich glaube nicht, dass Sie die schlechte '.:format' an das Ende angehängt werden, wenn Sie eine grundlegende map.resources tun. Wenn Sie Perioden in den Namen möchten, sind Sie nicht in Übereinstimmung mit den üblichen Schienen Stile, und ich denke, eine benutzerdefinierte Route könnte in Ordnung sein, wenn Sie absolut NEED die '.' in der URL.

Allerdings sollten Sie vielleicht Ihre Definition von to_param ändern. Was würdest du über folgendes denken?

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

Ich denke, wenn Sie dies mit Kunden-Websites zu verwalten, ist es eine recht elegante Art und Weise schön (und SEO freundlich) URLs wie

zu erzeugen
/websites/asd_dot_com/dns_records/new 
/websites/asd_dot_com/