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".