Frage

Ich möchte meine Rails 2.3.2 app reagieren und generieren URLs wie folgt:

/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 zum Beispiel:

/websites/1
/websites/1/dns_records

meine Website-Modell Durch Modifikation, kann ich besser URLs generieren etwa so:

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

Doch für Domainnamen, die enthalten ‚‘ Zeichen, bekommt Rails unglücklich. Ich glaube, das liegt daran, dass die ‚‘ Charakter ist definiert in Action :: Routing :: SEPARATOR, die Sonderzeichen enthält auf die URL zu teilen. Dies ermöglicht Ihnen, Sachen wie /websites/1.xml zu tun.

SO, ist es eine saubere Art und Weise zu ermöglichen '' Zeichen in RESTful URLs?

Ich habe versucht, Actioncontroller :: Routing :: SEPARATOR neu zu definieren, um nicht enthalten ‚‘, das ist eine ganz schlechte Art und Weise ist, das Problem zu lösen. Diese vermasselt generierten URLs durch Anhängen „Format“. Ihnen

Ich weiß auch, kann ich hinzufügen: Anforderungen => {: id => regexp} '' meiner config / routes.rb einen Domain-Namen übereinstimmen, der folgendes beinhaltet (Ohne dass dies, params [: id] ‚‘ zum Teil des Domainnamen gesetzt ist vor dem ersten)., Aber das hilft nicht, URLs / Pfade restfully bei der Erzeugung

Vielen Dank :) Nick

War es hilfreich?

Lösung

Das Problem, mit einem großen Dank an http: //poocs.net/2007/11/14/special-characters-and-nested-routes (und siehe http://dev.rubyonrails.org/ticket/6426 für zusätzliche Referenz)

Ich brauchte hinzuzufü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

ist einfach mit DRY zu halten, so dass: Anforderungen nicht für alle verschachtelten Routen für Websites angegeben werden. So konnte ich auch haben

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

Andere Tipps

Dies ist eine interessante Frage. Ich glaube nicht, Sie loszuwerden, die schlechten '.:format' am Ende angehängt bekommen können, wenn Sie eine grundlegende map.resources tun. Wenn Sie Perioden in den Namen wollen, sind Sie nicht in Übereinstimmung mit den üblichen Schienen Stilen, und ich denke, eine individuelle Route, um sein könnte, wenn Sie absolut NEED die ‚‘ in der URL.

Aber vielleicht sollten Sie Ihre Definition von to_param Wechsel in Betracht ziehen. Was würden Sie denken über die folgenden verwenden?

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

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

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

Ich hatte ein ähnliches Problem vor einiger Zeit und kam zu einer ähnlichen Lösung. Mit /.+/ als Voraussetzung für die param in Frage funktionierte gut für mich.

http://zargony.com/2009/05 / 05 / Routing-Parameter-with-ein-Punkt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top