Dzisiaj potrzebowałem napisać sobie metodę która nazwy działów zamieni na linki. Początkowo chciałem to zrealizować w modelu Menu gdzie po prostu wywoływałbym metodę to_url która zwracałaby mi adres w formie id-jakis-tam-link. Niestety wadą takiego rozwiązania jest fakt że wtedy linki mogłyby być generowane tylko z modelu Menu.
Aby tego uniknąć napisałem malutkie rozszerzenie do klasy String, które zamienia nam tekst na odpowiednik z samymi małymi literkami, usuwa nasze "ogonki", usuwa inne niechciane w URLach znaki oraz zamienia spacje na pauzy. Jest ona bardzo prosta i niezbyt elegancka ;) ale swoje robi. Sam proces zamiany znaków polskich na ich odpowiedniki "bezogonkowe" wzorowałem na kodzie Tomasha - ascii_tic. Jednak resztę miałem już napisaną zanim zacząłem szukać rozwiązania na usunięcie ogonków.
Poniżej zamieszczam cały kod rozwiązania:
# Dodatkowe metody klasy string class String # Zwraca strina bez polskich literek, z małej litery, z usuniętymi innymi # znakami oraze z zamienioną spacją na pauze (-) def to_url temp = self.downcase temp temp.gsub!(/[âäàãáäå�?ăąǎǟǡǻ�?ȃȧẵặ]/,'a') temp.gsub!(/[ëêéèẽēĕėẻȅȇẹȩęḙḛ�?ếễểḕḗệ�?]/,'e') temp.gsub!(/[�?iìíîĩīĭïỉ�?ịįȉȋḭɨḯ]/,'i') temp.gsub!(/[òóôõ�?�?ȯö�?őǒ�?�?ơǫ�?ɵøồốỗổȱȫȭ�?�?ṑṓ�?ớỡởợǭộǿ]/,'o') temp.gsub!(/[ùúûũūŭüủůűǔȕȗưụṳųṷṵṹṻǖǜǘǖǚừứữửự]/,'u') temp.gsub!(/[ỳýŷỹȳ�?ÿỷẙƴỵ]/,'y') temp.gsub!(/[ñǹń]/,'n') temp.gsub!(/[çć]/,'c') temp.gsub!(/[ß]/,'ss') temp.gsub!(/[œ]/,'oe') temp.gsub!(/[ij]/,'ij') temp.gsub!(/[�?ł]/,'l') temp.gsub!(/[ś]/,'s') temp.gsub!(/[źż]/,'z') temp.gsub!(/[^a-zA-Z 0-9]/, "") temp.gsub!(/\s/,'-') temp.gsub!(/\-+$/,'') temp.gsub!(/^\-+/,'') temp end # to_url tylko wykonane na sobie def to_url! self.replace self.to_url end end
Od teraz, mając jakikolwiek tekst, możemy na nim wywołac metodę to_url która zwróci nam jego "odpowiednik linkowy".