Ответ 1
Я не могу сказать вам более хороший способ справиться с этим, но я могу объяснить, почему это происходит.
Амперсанды не являются недопустимыми символами для URL. В противном случае у вас возникнут проблемы с: " http://host/pages/foo?bar=baz&style=foo_style" или что-то еще.
Изменить: Копая глубже в исходный код, похоже, что Rails использует CGI.escape только для параметров.
Вспомогательные, url-генераторы используют url_for (под обложками), который в конечном итоге вызывает: http://apidock.com/rails/ActionController/Routing/Route/generate Что вызывает материал в глубине sprivate-методов исходного кода... но в итоге заканчивается вызов CGI.escape(сначала посмотрите в actionpack/lib/action_controller/routing/route.rb, затем в actionpack/lib/action_controller/routing/segment.rb)
Конечный результат заключается в том, что на самом URL-адресе rails использует URI.escape, который вообще не обновляет амперсанды:
>> CGI.escape('/my_foo_&_bar')
=> "%2Fmy_foo_%26_bar"
>> URI.escape('/my_foo_&_bar')
=> "/my_foo_&_bar"
В настоящее время вы ничего не можете сделать об этом, не помещая фактический запрос функции в команду rails.
... если у вас нет возможности выбрать использование амперсандов в ваших URL-адресах Вы всегда можете использовать их для всех URL-адресов:
def my_clean_url(the_url)
return the_url.gsub(/&/,'_')
end
>> my_clean_url('/my_foo_&_bar')
=> "/my_foo___bar"
page_url(my_clean_url('/my_foo_&_bar'))