Rails RESTful utilisant to_param pour un champ qui contient des caractères de séparation
-
09-09-2019 - |
Question
Je veux que mes Rails 2.3.2 application pour répondre et générer des URL comme ceci:
/websites/asd.com
/websites/asd.com/dns_records/new
J'ai dans ma config / routes.rb,:
map.resources :websites, :has_many => :dns_records
map.resources :dns_records, :belongs_to => :website
Je peux alors accéder à des ressources telles que:
/websites/1
/websites/1/dns_records
En modifiant mon modèle de site Web, je peux générer de meilleurs URL comme ceci:
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
Cependant, pour les noms de domaine qui contiennent « » personnages, Rails devient malheureux. Je crois que c'est parce que le « » caractère est défini dans ActionController :: :: routage SEPARATORS, qui répertorie les caractères spéciaux pour diviser l'URL sur. Cela vous permet de faire des choses comme /websites/1.xml.
SO, est-il un moyen propre à permettre à '' caractères dans les URL RESTful?
J'ai essayé de redéfinir ActionController :: routage des SEPARATORS pour inclure non. », Ce qui est une façon tout à fait mauvais pour résoudre le problème. Ce bousille les URL générées par annexant «format ». Les
Je sais aussi que je peux ajouter: exigences => {: id =>} regexp à ma config / routes.rb pour correspondre à un nom de domaine qui comprend '' (Sans cela, params [: id] « » est fixé à la partie du nom de domaine avant le premier)., Mais cela ne suffit pas à générer des URL / chemins restfully
Merci :) Nick
La solution
Résolution du problème, avec un grand merci à http: //poocs.net/2007/11/14/special-characters-and-nested-routes (voir http://dev.rubyonrails.org/ticket/6426 pour référence supplémentaire)
Je avais besoin d'ajouter: exigences => {: website_id =>} regexp pour chaque itinéraire imbriquée qui allait aussi inclure un nom de domaine avec des périodes en elle.
Voici mon itinéraire de travail:
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
L'appel à
websites.with_options
est tout simplement conforme à sec afin que: les exigences ne doivent pas être spécifié pour toutes les routes imbriquées pour les sites Web. Donc, je pourrais aussi avoir
websites_requirements.resources :accounts
websites_requirements.resources :monthly_bandwidth_records
etc.
Autres conseils
Ceci est une question intéressante. Je ne pense pas que vous pouvez vous débarrasser de la mauvaise '.:format'
ajouté à la fin si vous faites un map.resources
de base. Si vous voulez périodes les noms, vous n'êtes pas en conformité avec les styles habituels de rails, et je pense un itinéraire personnalisé peut être dans l'ordre si vous absolument BESOIN . ' dans l'URL.
Cependant, peut-être vous devriez envisager de changer votre définition de to_param
. Que penseriez-vous sur l'utilisation de ce qui suit?
def to_param
domain_name.sub('.','_dot_')
end
Je pense que, si vous utilisez cette fonction pour gérer les sites clients, c'est une façon assez élégante pour générer des URL agréables (et SEO friendly) comme
/websites/asd_dot_com/dns_records/new
/websites/asd_dot_com/
J'ai eu un problème similaire il y a quelque temps et est venu à une solution similaire. L'utilisation /.+/ que l'exigence de la question en param a bien fonctionné pour moi.
http://zargony.com/2009/05 / 05 / routage paramètres-avec-un-point