10
votes

Routes de rails - Comment les faire de cas insensible?

Les itinéraires dans Ruby On Rails sont sensibles à la casse. Il semble que quelqu'un ait apporté cela auparavant, et il a été étiqueté ne corrigera pas.

http://rails.lighthouseApp.com/projects/8994/tickets/393-Routes-Are-Case-sensible

qui me frappe comme malheureux, comme Je ne vois pas vraiment de hausse sur ma propre application pour que des itinéraires soient sensibles à la casse, tandis que sur la baisse, cela crée un potentiel de confusion et une apparition générale du manque de polonais à mon avis.

Quel est le Meilleur moyen de faire mes itinéraires insensibles insensibles?

J'ai trouvé ce conseil sur une recherche Google: xxx

C'est intelligent, mais cela laisse toujours la web_feeds partie de l'URL sensible à la casse. Cependant, je ne vois aucune manière similaire à cela, sans entrer dans chaque combinaison possible de web_feeds manuellement, mais c'est évidemment une solution horrible pour n'importe quel nombre de raisons.


0 commentaires

6 Réponses :


12
votes

Les itinéraires dans les rails sont sensibles à la casse car les URL sont sensibles à la casse. De W3C :

Les URL en général sont sensibles à la casse (à l'exception des noms de la machine). Il peut y avoir des URL ou des parties d'URL, En cas d'importance, mais L'identification de ceux-ci peut ne pas être facile. Les utilisateurs doivent toujours considérer que les URL sont sensibles à la casse.


5 commentaires

Intéressant, ne le savait pas.


Je pense que si le Web avait commencé sous Windows, il se serait peut-être pas avéré de cette façon!


J'apprécie le fait qu'il y ait des moments où il est important de pouvoir différencier des cas (bien que franchement les seules instances que je puisse penser sont des cas d'angle), mais pour l'utilisation ordinaire, cela s'oppose aux attentes de l'utilisateur. Les utilisateurs s'attendent à ce que Stackoverflow.com/Questtions soit identique à Stackoverflow.com/Questtions, et en effet, c'est le cas. Et je ne suis pas sûr que les utilisateurs ordinaires ne prennent pas l'avis du W3C qu'ils «devraient toujours considérer que les URL sont sensibles à la casse».


Je pense que l'on devrait être indulgent vers ce que les humains entrent mais 301 redirigent vers la version canonique de l'URL.


@Llele avec le gemme de route_downcaseur, vous avez la possibilité de faire une redirection si vous le souhaitez.



3
votes

Eh bien, vous pourriez essayer une autre approche. Faites de l'affaire Transformer Serverside et envoyez tout sur Rails Downcase.

Je pense que vous pouvez y parvenir avec mod_rewrite ou mod_spelling.


0 commentaires

0
votes

Bien que les URL soient sensibles à la casse, si vous voulez faire vos itinéraires insensibles, vous pouvez le faire.

dans application_controller.rb Mettez: P>

rescue_from ActionController::RoutingError do |exception|
 redirect_to request.url.downcase
end


1 commentaires

Vous devriez vérifier s'il est déjà descendu, quelque chose comme si request.url! = Demande.url.downeCase redirect_to request.url.downeCe



7
votes

J'ai juste le même problème et j'ai résolu le middleware - jetez un coup d'œil ici:

http://gehling.dk/ 2010/02 / How-To-make-Rails-Routing-Case-insensible /

Remarque: cela ne s'applique que pour les rails 2.3 +

  • CARSTEN

4 commentaires

La solution ci-dessus n'a pas fonctionné pour les rails 3, mais j'ai réparé cela maintenant.


J'ai finalement fait cela dans un joyau, il est donc beaucoup plus facile d'utiliser: rubygems.org/gems/route_downcaseur


Cette solution est problmatique si vous avez un nom d'actifs / images dans un cas mixte. Par exemple, si vous utilisez déjà une image d'actifs / images / abc_xyzz.png (cas mixte), ensuite après avoir utilisé cette solution, il tentera de localiser une image à des actifs / images / abc_xyzz.png (minuscule) et serveur va répondre avec 404 non trouvé.


@Nadeemyasin ceci est résolu en utilisant l'initialisateur d'exclusion. # config / initializers / route_downcaser.rb routedowncaser.configuration do | config | config.redirect = true config.exclude_patterns = [/ actifs \ // i, / polices \ // i, / Quelques \ / IMPORT \ / chemin / i = i] fin



2
votes

Just Monkey-Pattez-le à Downcase par défaut. Exemple simple: xxx


1 commentaires

Comme les États du W3C, les URL sont sensibles à la casse



2
votes

Une solution simple est, n'est peut-être pas une solution élégante, mais pourtant de travail est: Utilisez un fichier avant_filter dans votre contrôleur d'application comme celui-ci.

  before_filter :validate_case

  def validate_case
    if request.url != request.url.downcase
      redirect_301_permanent_to request.url.downcase
    end
  end

  def redirect_301_permanent_to(url)
     redirect_to url, :status=>:moved_permanently 
  end


1 commentaires

Il vaut mieux le faire dans le rack. Dans le contrôleur d'application, vous avez déjà passé le répartiteur de route des rails.