Schienen RESTful Ressourcen für ein Feld mit to_param, die Trennzeichen enthält
-
09-09-2019 - |
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
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