Routing: Unescape urls


#1

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/%D0%9A%D0%B0%D1%80%D1%82%D0%B0--Киев--30295?page=4

Rails double escapes url?

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

Thanks in advance,
Eduard


#2

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


#3

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


#4

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