Rails RESTful utilisant to_param pour un champ qui contient des caractères de séparation

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

  •  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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top