Нормализация параметров именованного маршрута в рельсах - PullRequest
1 голос
/ 21 декабря 2010

Я снова борюсь с рельсами 3 и маршрутами.

Вот проблема:

Я создал именованный маршрут, например, такой:

match '/download/artist/:artist/album/:albumName', :to => "albums#show", :as => :search, :via => :get, который дает мне этот маршрут: search_path

У меня также есть классический пример: get "albums/show", который дает мне этот маршрут: albums_show_path.

Однако, когда я использую search_path с некоторыми параметрами, подобными этим:

<%= link_to "#{result.name[0..50]}(...)", search_path(:artist =>result, :albumName => result.name), :class => "albumName" %>

, происходит сбой, но не с album_show_path.Вот ошибка:

no route matches {:controller=>"albums", :action=>"show", :artist=>"Eddie Vedder & Ben Harper", :albumName=>"My City of Ruins / My Father's House (Live) [Benefiting Artists for Peace and Justice Haiti Relief] {Digital 45}"}

Я знаю, что это, вероятно, потому что параметр albumName не экранирован.Но даже после попытки сбежать с помощью CGI.escape не работает.Я полагаю, мне нужно сделать это в route.rb, но я понятия не имею, как.

У вас есть идеи, как это сделать?

EDIT

Ошибка говорит: нет совпадения маршрута и т. Д. Если у меня нет параметра с недопустимыми символами, он находит маршрут.

** EDIT rake routes **

welcome_index GET /welcome/index(.:format) {:controller=>"welcome", :action=>"index"} albums_index GET /albums/index(.:format) {:controller=>"albums", :action=>"index"} albums_show GET /albums/show(.:format) {:controller=>"albums", :action=>"show"} search GET /download/artist/:artist/album/:albumName(.:format) {:controller=>"albums", :action=>"show"} albums_show_album_info GET /albums/show_album_info(.:format) {:controller=>"albums", :action=>"show_album_info"} albums_show_itunes GET /albums/show_itunes(.:format) {:controller=>"albums", :action=>"show_itunes"} albums_show_spotify GET /albums/show_spotify(.:format) {:controller=>"albums", :action=>"show_spotify"} albums_show_carrefour GET /albums/show_carrefour(.:format) {:controller=>"albums", :action=>"show_carrefour"} root /(.:format) {:controller=>"welcome", :action=>"index"}

1 Ответ

0 голосов
/ 21 декабря 2010

Вы можете поменять недопустимые символы (какими бы они ни были) с помощью gsub:

<%= link_to "#{result.name[0..50]}(...)", search_path(:artist =>result, :albumName => result.name.gsub("/","\/").gsub("whateverelse", "newvalue"), :class => "albumName" %>

Я думаю, что это потому, что / интерпретируются как обозначение разделения пути (я забыл его истинное имя) в URL. Вы также можете "gisub" в виде гирлянды ", если хотите; см. выше.

...