読者です 読者をやめる 読者になる 読者になる

Webサービスを作って潰すのが趣味な人のブログ

とりあえず作ってから怒られよう

【Rails】URLに「.」(ドット)を含みたい場合の対処法2つ

ダメだと言われようと男にはURLにドットを含めたい日もあるんです。そんなハードボイルドな生き方がしたいktです。

 

何アホな事言ってんだって思われそうなので早速本題

先日タグ機能を実装しているサイトでユーザーさんがこんなタグを使ってエラーを踏みました

 

 

「S.E.E.D」

 

 

Railsは「.」を拡張子の「.」だと自動認識するのでちゃんと指定してやらないとエラーになっちゃうんですね

 

具体的な使用例

URLリダイレクトをかける時とか

http://example.net/redirect/url/http://google.com

 

Wikipediaみたいな単語辞書とか記事タイトルやタグなどに「.」を含みたい時とか

http://example.net/diary/T.M.Revolution
 

これらはRailsがフォーマット形式だと認識して404を返してしまいます、それを避けるためにはいくつか方法があるので参考までに:D


対処法その1 URLをエスケープしてクエリとして渡す

動きゃいいということでURLに組み込むのではなくGETクエリとして渡します

 

Before: http://example.net/redirect/url/http://google.com
After: http://example.net/redirect/url?url=http%3A%2F%2Fgoogle%2Ecom

 

URLエンコードしてしまえば「.」を含んでいても関係なく渡すことができますので即席対応としては良いですね

 

URI.escape("http://google.com")

 

ただこの方法はURLがあまり美しくないってのとユーザーの手打ちに対応できないって事からあまりクールじゃありません、ベターくらいです

 

出来ればそのまま使えるほうが良いですよね

 

対処法その2 文字列として取得する

どっちかというとこっちが本命です。

 

match "redirect/url/:url_string" => "redirect#url", format: false, url_string: /.*/

 

formatを無効にして取得するクエリを「/.*/」(全てに一致)させることで思い通りの挙動となります。

 

「どっちのほうがいいのか」っていうとまあ後者の方が良いんだけど逆にあんまり詳しくないユーザーにユーザーに手打ちで対応されたくないとか理由があるならエスケープしちゃってもいいかと思います

 

またね~