2010-01-26 14 views
9

Chcę, aby użytkownicy mogli mieć stronę profilu na stronie site.com/myNameHere. Railsy szukają kontrolera o nazwie "myNameHere". Czy jest możliwe ustawienie routes.rb tak, że jeśli kontroler nie zostanie znaleziony, "myNameHere" zostanie wysłany jako parametr do innego kontrolera?Jak mogę wdrożyć niestandardowe adresy URL w aplikacji Rails?

+0

Po prostu upewnij się, że jeśli zdecydujesz się użyć klejnotu marności wiesz, że jest wulgaryzacja w vanities_controller.rb w przekierowaniu, aby dodać: only_path => true i powinieneś być dobry – dennis

Odpowiedz

9

Możesz dodać trasę tak:

map.profile_link '/:username', :controller => 'profiles', :action => 'show' 

Pamiętaj, aby dodać go na tyle niska w pliku poniżej swoich zasobów, aby nie kolidować z innymi drogami. Powinien mieć najniższy priorytet. Następnie musisz zmienić działanie programu, aby użyć nazwy użytkownika zamiast id:

def show 
    @user = User.find_by_username(params[:username]) 
end 

To wszystko. Szczęśliwe kodowanie!

UPDATE:

I Rozszerzyliśmy tę odpowiedź do pełnego blogu, Vanity URLs in Ruby on Rails Routes. Mam dodatkowe próbki kodu i dokładniejsze wyjaśnienie.

+0

Dzięki, pracowałeś jak czar. – user258980

+2

Należy pamiętać, że trasa z symbolem wieloznacznym na poziomie podstawowym będzie pułapką błędów na najwyższym poziomie 404. To znaczy. http://domena.com/askdjasd. Więc prawdopodobnie chcesz dodać obsługę wyjątków (nie znaleziono) w akcji pokazu i wyrenderować błąd 404 zamiast błędu 500. –

+5

W oparciu o to, co powiedział Dave Rapin, możesz użyć 'rescue_from ActiveRecord :: RecordNotFound,: with =>: your_404_method' w swoim kontrolerze, aby automatycznie wyświetlać błędy 404, gdy żaden użytkownik nie zostanie znaleziony. Będziesz musiał podnieść ten błąd ręcznie, jeśli używasz metody 'find_by_attribute', ponieważ nie podnosi ich automatycznie. Tak więc użyj 'raise ActiveRecord :: RecordNotFound, chyba że @ user = User.find_by_username (parametry [: username])' i związany z nim ratownik i jesteś złoty. – coreyward

0

Po prostu pomyślałem, że zaktualizuję to dla Rails 3. Mam pole "witryna" w moim modelu użytkownika, który będzie działał jako marność, i zamierzam prowadzić do statycznej strony dla każdej marności trasy. Chcę wyświetlać wszystkie zdarzenia użytkowników, jeśli nazywa się marność.

#config/routes.rb 
    get '/:website', :controller => 'static_pages', :action => 'vanity' 

#app/controllers/static_pages_controller.rb 
    def vanity 
     @user = User.find_by_website(params[:website]) 
    if @user != nil #in case someone puts in a bogus url I redirect to root 
     @events = @user.events 
    else 
     redirect_to :root 
    end 
    end 

#app/views/static_pages/vanity.html.erb 
<h1><%= @user.website %> events</h1> 

<table> 
    <tr> 
    <th>Title</th> 
    <th>Starts at</th> 
    <th>Description</th> 
    <th></th> 
    <th></th> 
    <th></th> 
    </tr> 

<% @events.each do |event| %> 
    <tr> 
    <td><%= event.title %></td> 
    <td><%= event.starts_at %></td> 
    <td><%= event.description %></td> 
    </tr> 
<% end %> 
</table> 

Myślę, że to dobra alternatywa, jeśli nie chcesz używać klejnotów.

Powiązane problemy