質問: 現在、railsで開発したサイトで日本語URLを利用しています。 facebookの共有URLをrequest.urlで生成しているのですが、 下記のエラーが出てしまい、うまく動きません。 > > incompatible character encodings: UTF-8 and ASCII-8BIT > > > 多くのサイトで下記の方法で解決していたのですが ``` request.url.force_encoding("utf-8") ``` 記述忘れを防ぐためにも、毎回`force_encoding("utf-8")`を用いてエンコードせずに `request.url`のメソッド自体をオーバーライドしてエンコードしたいと考えています。 どのようにすれば既存の`request.url`のメソッドをオーバーライドできるでしょうか?
回答: アラウンドエイリアスというテクニックを使えば実現は可能です。 以下のコードをlib配下に置くなりして、Rails起動時に読み込むようにしてみてください。 (rails 4.2.3で確認) ``` class ActionDispatch::Request alias_method :__url, :url def url __url.force_encoding("utf-8") end end ``` requestのurlメソッドを別名で退避してから、新urlメソッドでエンコードしたURLを返します。 ただし、元々urlメソッドを呼び出していた箇所(Rails内も含め!)の挙動が変わる可能性があるので、そこは注意してください。(ひょっとしたら何か不都合があるかも) facebookの共有URLを生成する箇所が分かっているなら、素直にエンコード済みURLを返すようなヘルパーを作った方が無難だと思います。