# Routing: Unescape urls

**URL:** <https://www.ruby-forum.com/t/routing-unescape-urls/166565>\
**Category:** Rails\
**Created:** [April 27, 2009, 1:31pm UTC](https://www.ruby-forum.com/t/routing-unescape-urls/166565 "2009-04-27T13:31:48Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![edbond](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/13edae/32.png) [@edbond](https://www.ruby-forum.com/u/edbond)\
**Post date:** [April 27, 2009, 1:31pm UTC](https://www.ruby-forum.com/t/routing-unescape-urls/166565/1 "2009-04-27T13:31:48Z")

</div>

Hello All,

How to make rails unescape incoming urls? I want to use russian chars  
in routes, like:

map.city URI.escape(“/ÐšÐ°Ñ€Ñ‚Ð°–:title–:id”), :controller =\>  
“cities”, :action =\> “show” It seems to works (page loads) but all  
links on page looks like this:  
[http://localhost/%25D0%259A%25D0%25B0%25D1%2580%25D1%2582%25D0%25B0--Киев--30295?page=4](http://localhost/%25D0%259A%25D0%25B0%25D1%2580%25D1%2582%25D0%25B0--%D0%9A%D0%B8%D0%B5%D0%B2--30295?page=4)

Rails double escapes url?

Also I tried url\_for(… :escape =\> false), it doesn’t help.

Thanks in advance,  
Eduard

---

<div class="post-metadata">

**Author:** ![edbond](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/13edae/32.png) [@edbond](https://www.ruby-forum.com/u/edbond)\
**Post date:** [April 28, 2009, 11:35am UTC](https://www.ruby-forum.com/t/routing-unescape-urls/166565/2 "2009-04-28T11:35:32Z")

</div>

SOLVED:  
double escape fix

# 

# skip escaping of already escaped value

# 

ActionController::Routing::Segment.class\_eval(\<\<-FIX, **FILE** ,  
**LINE** +1)  
def interpolation\_chunk  
value.include?(’%’) ? value : URI.escape(value, UNSAFE\_PCHAR)  
end  
FIX

Best regards to All,  
Eduard

---

<div class="post-metadata">

**Author:** ![edbond](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/13edae/32.png) [@edbond](https://www.ruby-forum.com/u/edbond)\
**Post date:** [April 28, 2009, 12:37pm UTC](https://www.ruby-forum.com/t/routing-unescape-urls/166565/3 "2009-04-28T12:37:11Z")

</div>

Much simpler:  
ActionController::Routing::Segment::RESERVED\_PCHAR=‘:@&=+$,;%’

Ticket / Patch:  
[https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/2574-routing-double-escape-url-segments](https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/2574-routing-double-escape-url-segments)

---

<div class="post-metadata">

**Author:** ![edbond](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/13edae/32.png) [@edbond](https://www.ruby-forum.com/u/edbond)\
**Post date:** [April 28, 2009, 12:53pm UTC](https://www.ruby-forum.com/t/routing-unescape-urls/166565/4 "2009-04-28T12:53:03Z")

</div>

err,

to work properly you need to change other constants too.  
Add this at top of your routes.rb:

ActionController::Routing::Segment.class\_eval(\<\<-FIX, **FILE** ,  
**LINE** +1)  
RESERVED\_PCHAR=’:@&=+$,;%’  
SAFE\_PCHAR = “#{URI::REGEXP::PATTERN::UNRESERVED}#  
{RESERVED\_PCHAR}”  
UNSAFE\_PCHAR = Regexp.new("[^#{SAFE\_PCHAR}]", false, ‘N’).freeze  
FIX
