2009-04-07 10 views

Odpowiedz

7

Wszystkie te rozwiązania używają find_by_name, co zdecydowanie wymagałoby posiadania indeksu na tej kolumnie i wymagają, aby były unikatowe. Lepszym rozwiązaniem, które wykorzystaliśmy, poświęcając niewielką ilość piękna, jest użycie przedrostka nazwy dostawcy z jego identyfikatorem. Oznacza to, że nie musisz mieć indeksu na swojej kolumnie nazwy i/lub wymagać wyjątkowości.

vendor.rb

def to_param 
    normalized_name = name.gsub(' ', '-').gsub(/[^a-zA-Z0-9\_\-\.]/, '') 
    "#{self.id}-#{normalized_name}" 
end 

Więc to nie daje URL jak

/1-Acme

/19-Safewaya

itp

Następnie w pokazie działania nadal można używać

Vendor.find(params[:id]) 

jako że metoda będzie niejawnie nazywać .to_i na swojej tezy, a nazywając to_i na taki ciąg zostanie zawsze powrócić prefiksem liczbowej i upuść pozostałego na tekście jej wszystko puch w tym punkcie.

Powyższe zakłada używasz trasę domyślną /:controller/:action/:id, co uczyniłoby adresy URL wyglądać

/sprzedawców/show/1-Acme

Ale jeśli chcesz je tylko patrzeć

/1-Acme

wtedy trasy jak

map.show_vendor '/:id', :controller => 'vendors', :action => 'show' 

Sugerowałoby to, że połknie wiele adresów URL, których prawdopodobnie nie chciałbyś. Ostrzegaj.

+0

Cześć, dzięki za to - co masz na myśli mówiąc "połknij wiele adresów URL, których nie chcesz"? oh, masz na myśli, że trasa zmieniłaby prawie wszystko, co nazywasz tym kontrolerem? Mam się dobrze z dostawcami/programem show/1-Acme ... jak to wpływa na SEO? – AFG

+0

Tak, "/: id" pasowałoby do wielu rzeczy, więc musiałbyś mieć wiele nazwanych tras dla "/ about", "/ contact", itd. Jeśli chodzi o SEO, myślę, że prefiks liczby jest znikomy . –

+0

W jaki sposób utworzyć nazwaną trasę dla dostawców/list, która odpowiadałaby akcji w pliku vendor_controller.rb nazywanej "listą"? Dzięki. W przeciwnym razie wygląda dobrze. – AFG

0

Będę musiał trochę poeksperymentować, żeby to naprawić, ale są dwie podstawowe części rozwiązania.

1) Dodaj trasę. w config/routes, dodaj linię, która wysyła żądania do postaci baseurl/controller /: nazwa-dostawcy do akcji showummary, (lub może do nowej akcji, show_summary_by_vendor_name) [również, jeśli planowałeś użyć baseurl /: vendorname , to też jest w porządku). Dla wygody upewnij się, że parametr jest podobny do: nazwa-dostawcy, a nie wartość domyślna: id

2) Zapisz działanie kontrolera. W pliku kontrolera edytuj swoje działanie showummary, aby odróżnić na podstawie tego, czy jest on wywoływany z identyfikatorem, czy z nazwą sprzedawcy, lub po prostu wpisz nazwę show_summary_by_vendor_name. (w zależności od najlepszych praktyk i trasy, którą napisałeś w 1. Nie wiem od początku mojej głowy co jest lepsze) Możesz następnie wykonać @vendor = Vendors.find_by_name (parametry [: nazwa_sprzedawcy]) lub coś takiego, a następnie renderuj to w sposób, w jaki robisz to w regularnych showpointy.

3) Użyj tego jako linku. Po potwierdzeniu, że baza danych baseurl [/ controller?]/Vendor-name działa i pokazuje podsumowanie, upewnij się, że wszystkie łącza w Twojej aplikacji i gdziekolwiek indziej używają tego linku. Poza tym nie pamiętam, jak trudno jest zintegrować niestandardową trasę w link_to, ale myślę, że jest to wykonalne. Większość wyszukiwarek [google] opiera się głównie na linkach, więc dobry SEO będzie używał tych nazwanych linków, a nie tych ponumerowanych. Myślę. Nie wiem zbyt wiele o SEO.

3

Ryan Bates ma świetny screencast na ten właśnie temat.

Zasadniczo przeładowuje się metodę to_param w modelu dostawcy.

def to_param 
    permalink 
    end 

Następnie, jeśli spojrzeć w górę zasobu w kontrolerze można zrobić coś takiego:

@vender = Vender.find_by_name(params[:id]) 

Ale problem polega na tym, że będziesz musiał się upewnić, że nazwy są sprzedawców wyjątkowy. Jeśli nie mogą, należy wykonać inne rozwiązanie, które sugeruje Ryan, gdzie wstawia id do nazwy, a następnie analizuje wynikowy identyfikator użytkownika, aby znaleźć identyfikator przedmiotu.

1

Dokonujesz tego, modyfikując trasy, które są używane do uzyskania dostępu do tych adresów URL i zmieniając je w celu użycia: name, a nie: id. Będzie to prawdopodobnie oznaczać, że musisz sam pisać trasy, zamiast polegać na zasobach.

Na przykład dodaj to do tras.rb file:

map.with_options :controller => "vendor" do |vendor| 
    vendor.connect "/vendor/:name", :action => "show" 
    # more routes here for update, delete, new, etc as required 
end 

Druga zmiana, która będzie wymagana jest to, że teraz trzeba będzie znaleźć obiekt dostawcy w bazie danych przez nie nazwy identyfikatora, więc:

@vendor = Vendor.find_by_name(params[:name]) 

Wewnętrznie (przynajmniej według mojej wiedzy/eksperymentowania) nazwa parametru, która nie jest określona w części adresu URL trasy (tj. nie w części "/ Controller/Action /: id") jest przypięta do końca jako parametr.

6

Pomyślałem, że wspomnę o parametrach String # jako uzupełnienie do oznaczonej odpowiedzi.

def to_param 
    "#{id}-#{name.parameterize}" 
end 

To będzie odfiltrować znaki łącznikiem, wymień przestrzeni z myślnikami itp

+0

, co jest interesujące ... Jakieś wady? – AFG

+0

Wszystko ma wady! Jednym z nich może być to, że link zmieni się automatycznie, jeśli zmieni się atrybut "nazwa", który można kontrolować dokładniej, jeśli zmagazynujesz permalink w oddzielnym atrybucie w bazie danych. –