Mijn artikel over mooie URL’s in Rails was nog niet een week de deur uit, of ik werd al gewezen op 404 (page not found) errors door een collega. Al gauw kwam ik tot de vaststelling dat URL’s met escaped characters of punten in niet meer juist verwerkt werden.
De route
map.artikel 'artikel/:id', :controller => 'artikels', :action => 'show'
Ik gebruik ook to_param zoals in het artikel hierboven.
De oorzaak
Voor zo ver ik weet was tot rails 1.1.6 een forward slash ”/” de enige route delimiter. Simply put, wannneer een request naar rails gestuurd werd, werd een path als
/artikel/12-Gorilla+webdesign+is+soo+2.0+!
opgesplitst
in 2 delen, om de controller en het artikel id te bekomen. Sinds rails
1.2 echter, zijn er meer karakters die een route delimiter voorstellen,
namelijk: ’/’, ’;’, ’.’, ’,’ en ’?’. Bijgevolg zou de URI
hierboven gesplitst worden in 3 delen, waardoor de route niet meer
herkend wordt en er dus een 404 fout optreedt. Ook url’s met een
ampersand waren gebroken, omdat die ampersand in url’s ge-escaped wordt
naar '&'. Hetzelfde geld voor vraagtekens, afkappingstekens, etc..
De oplossing
Om te zorgen dat je route toch nog dots en andere characters ondersteunt, vul je die aan met een :requirements parameter;
map.artikel 'artikel/:id', :controller => 'artikels', :action => 'show', :requirements => {:id => /.*/ }Hiermee zeg je dat de :id parameter moet voldoen aan de reguliere expressie ”/.*/”, wat er op neerkomt dat elke character toegelaten wordt.
Blog aandacht
Ik vind het vreemd dat hierover niet meer commotie is ontstaan. Met moeite heb ik een artikel gevonden op skwpspace.com dat hierover gaat. Waarschijnlijk zijn er momenteel wel meer rail’ers die hier ook mee kampen en in het duister tasten..
Reacties